Jak sprawdzić, czy baza danych mysql istnieje


292

Czy można sprawdzić, czy baza danych (MySQL) istnieje po nawiązaniu połączenia?

Wiem, jak sprawdzić, czy tabela istnieje w bazie danych, ale muszę sprawdzić, czy baza danych istnieje. Jeśli nie, muszę wywołać inny fragment kodu, aby go utworzyć i wypełnić.

Wiem, że to wszystko brzmi trochę nieelegancko - jest to szybka i brudna aplikacja.

Odpowiedzi:


463
SELECT SCHEMA_NAME
  FROM INFORMATION_SCHEMA.SCHEMATA
 WHERE SCHEMA_NAME = 'DBName'

Jeśli potrzebujesz tylko wiedzieć, czy baza danych istnieje, aby nie wystąpił błąd podczas próby jej utworzenia, po prostu użyj ( stąd ):

CREATE DATABASE IF NOT EXISTS DBName;

9
Pierwszy dobry. Drugi nie tak bardzo. Możesz nie mieć uprawnień do tworzenia bazy danych.
O. Jones

21
@OllieJones drugi jest zbyt dobry, odpowiadającego nabiera jeśli PO chce stworzyć bazę danych
Nawfal

3
Dlaczego „INFORMACJE_SCHEMA” jest wielkimi literami? Ze mną jest to wszystko małymi literami
Hubro

3
* OK, najwyraźniej PHPMyAdmin wyświetla tylko wszystkie nazwy baz danych małymi literami, a twoje zapytanie działa przy użyciu obu tych
metod

1
Zgadzam się z @nawfal; Może nie chcę tworzyć bazy danych, po prostu wiem, czy ona istnieje.
SteveCinq

122

Prostym sposobem sprawdzenia, czy baza danych istnieje, jest:

SHOW DATABASES LIKE 'dbname';

Jeśli baza danych o nazwie „dbname” nie istnieje, otrzymujesz pusty zestaw. Jeśli istnieje, otrzymasz jeden wiersz.


1
Działa lepiej niż rozwiązanie oznaczone jako prawidłowe. Dzięki]
John Williams

Aby uzyskać oficjalne informacje wyjaśniające tę dobrą odpowiedź, przejdź do strony dokumentacji oficjalnej strony internetowej na temat polecenia: dev.mysql.com/doc/refman/5.5/en/show-databases.html (przydatna strona z samouczkami doprowadziła mnie do tego, dev .mysql.com / doc / refman / 5.5 / pl / database-use.html („Podręcznik MySQL 5.5 / Samouczek / Tworzenie i korzystanie z bazy danych”)
Edward

2
Może to być wolniejsze niż bezpośrednie zapytanie INFORMACJE_SCHEMA, ale jest o wiele bardziej czytelne i łatwe do zrozumienia, co w moim przypadku było ważniejsze.
Daniel Howard,

Jest to lepsze rozwiązanie, ponieważ jeśli testujesz istnienie bazy danych, możesz chcieć ją utworzyć. „Utwórz bazę danych, jeśli nie istnieje” jest denerwujące, ponieważ jeśli baza danych istnieje, to poniższy kod definiujący tabele zbombarduje. Nie widzę przydatności polecenia.
Keir

@Keir Choć może to wydawać się denerwujące, wyobraź sobie, że dwa wątki próbują jednocześnie stworzyć tę samą bazę danych i co by się stało, gdyby jeden się nie powiódł. Chociaż nie jest przydatne do określania, czy baza danych istnieje przed próbą jej utworzenia, jest przydatna do zapobiegania kolizjom, gdy wiele wątków może próbować ją utworzyć.
Brogan

22

Jeśli szukasz skryptu php, zobacz poniżej.

$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$link) {
  die('Not connected : ' . mysql_error());
}

// make foo the current db
$db_selected = mysql_select_db('foo', $link);
if (!$db_selected) {
  die ('Cannot use foo : ' . mysql_error());
}

22

Z muszli jak bash

if [[ ! -z "`mysql -qfsBe "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME='db'" 2>&1`" ]];
then
  echo "DATABASE ALREADY EXISTS"
else
  echo "DATABASE DOES NOT EXIST"
fi

3
To tak naprawdę nie działa ... Zamiast tego spróbuj czegoś takiego: `result = $ (mysql -s -N -e" WYBIERZ SCHEMA_NAME Z INFORMACJI_SCHEMA.SCHEMATA GDZIE SCHEMA_NAME = 'db' "); if [-z "$ result"]; następnie echo „db nie istnieje”; fi
Steven Green,

1
Adaptacja @ StevenGreen działa dobrze, więc +1 dla fragmentu bash / sql.
Bobble

Nie zapomnij podać danych użytkownika w wierszu polecenia lub w pliku .my.cnf.
Pan Goobri

11

Oto funkcja bash do sprawdzania, czy baza danych istnieje:

function does_db_exist {
  local db="${1}"

  local output=$(mysql -s -N -e "SELECT schema_name FROM information_schema.schemata WHERE schema_name = '${db}'" information_schema)
  if [[ -z "${output}" ]]; then
    return 1 # does not exist
  else
    return 0 # exists
  fi
}           

Inną alternatywą jest próba użycia bazy danych. Pamiętaj, że to sprawdza również uprawnienie:

if mysql "${db}" >/dev/null 2>&1 </dev/null
then
  echo "${db} exists (and I have permission to access it)"
else
  echo "${db} does not exist (or I do not have permission to access it)"
fi

+1 dla alternatywy, ale >/dev/nullgwarantuje, że wynik jest zawsze zerowy. Spróbuj czegoś takiego if [ -z "$(mysql ${db} 2>&1 </dev/null)" ]; then ....
Bobble

@Bobble >/dev/nullNie zmienia kodu wyjścia z działania mysql. Po prostu ukrywa wyjście, jeśli wystąpi błąd. if ...; thenCzęść sprawdza kod wyjścia.
docwhat

9

Świetnym sposobem sprawdzenia, czy baza danych istnieje w PHP jest:

$mysql = mysql_connect("<your host>", "root", "");

if (mysql_select_db($mysql, '<your db name>')) {
    echo "Database exists";
} else {
    echo "Database does not exist";
}

To jest metoda, której zawsze używam.



5
CREATE SCHEMA IF NOT EXISTS `demodb` DEFAULT CHARACTER SET utf8 ;

4
SELECT IF('database_name' IN(SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA), 1, 0) AS found;

4

Dla tych, którzy używają php z mysqli, to jest moje rozwiązanie. Wiem, że odpowiedź już została udzielona, ​​ale pomyślałem, że przydałoby się ją również jako oświadczenie przygotowane przez mysqli.

$db = new mysqli('localhost',username,password);
$database="somedatabase";
$query="SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME=?";
$stmt = $db->prepare($query);
$stmt->bind_param('s',$database);
$stmt->execute();
$stmt->bind_result($data);
if($stmt->fetch())
{
    echo "Database exists.";
}
else
{
    echo"Database does not exist!!!";
}
$stmt->close();

4

Za pomocą bash:

if [ "`mysql -u'USER' -p'PASSWORD' -se'USE $DATABASE_NAME;' 2>&1`" == "" ]; then
    echo $DATABASE_NAME exist
else
    echo $DATABASE_NAME doesn't exist
fi

2

Rozwinięty i zawiły (ale ze mną!), Oto system klasy, który stworzyłem, aby sprawdzić, czy DB istnieje, a także aby utworzyć wymagane tabele:

<?php
class Table
{
    public static function Script()
    {
        return "
            CREATE TABLE IF NOT EXISTS `users` ( `id` INT NOT NULL PRIMARY KEY AUTO_INCREMENT );

        ";
    }
}

class Install
{
    #region Private constructor
    private static $link;
    private function __construct()
    {
        static::$link = new mysqli();
        static::$link->real_connect("localhost", "username", "password");
    }
    #endregion

    #region Instantiator
    private static $instance;
    public static function Instance()
    {
        static::$instance = (null === static::$instance ? new self() : static::$instance);
        return static::$instance;
    }
    #endregion

    #region Start Install
    private static $installed;
    public function Start()
    {
        var_dump(static::$installed);
        if (!static::$installed)
        {
            if (!static::$link->select_db("en"))
            {
                static::$link->query("CREATE DATABASE `en`;")? $die = false: $die = true;
                if ($die)
                    return false;
                static::$link->select_db("en");
            }
            else
            {
                static::$link->select_db("en");          
            }
            return static::$installed = static::DatabaseMade();  
        }
        else
        {
            return static::$installed;
        }
    }
    #endregion

    #region Table creator
    private static function CreateTables()
    {
        $tablescript = Table::Script();
        return static::$link->multi_query($tablescript) ? true : false;
    }
    #endregion

    private static function DatabaseMade()
    {
        $created = static::CreateTables();
        if ($created)
        {
            static::$installed = true;
        }
        else
        {
            static::$installed = false;
        }
        return $created;
    }
}

W tym możesz zastąpić nazwę bazy danych en dowolną nazwą bazy danych, którą chcesz, a także zmienić skrypt twórcy na dowolny i (mam nadzieję!), Że go nie złamie. Jeśli ktoś może to poprawić, daj mi znać!

Uwaga:
Jeśli nie korzystasz z programu Visual Studio z narzędziami PHP, nie martw się o regiony, ponieważ służą one do składania kodu: P


2

Za pomocą tego skryptu możesz uzyskać Tak lub Nie istnieje baza danych, jeśli nie istnieje, nie zgłasza wyjątku.

SELECT 
    IF(EXISTS( SELECT 
                SCHEMA_NAME
            FROM
                INFORMATION_SCHEMA.SCHEMATA
            WHERE
                SCHEMA_NAME = 'DbName'),
        'Yes',
        'No')  as exist

1

Kod szyny:

ruby-1.9.2-p290 :099 > ActiveRecord::Base.connection.execute("USE INFORMATION_SCHEMA")

ruby-1.9.2-p290 :099 > ActiveRecord::Base.connection.execute("SELECT SCHEMA_NAME FROM         INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'entos_development'").to_a
SQL (0.2ms) SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME =               'entos_development'
=> [["entos_development"]] 
ruby-1.9.2-p290 :100 > ActiveRecord::Base.connection.execute("SELECT SCHEMA_NAME FROM              INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'entos_development1'").to_a
SQL (0.3ms) SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME =            'entos_development1'
=> []

=> entos_development istnieje, entos_development1 nie istnieje



1

Korzystam z następującego zapytania:

"USE 'DBname'"

Następnie sprawdź, czy wynikiem jest FAŁSZ. W przeciwnym razie może wystąpić błąd odmowy dostępu, ale nie mogę tego wiedzieć. Tak więc w przypadku przywilejów można użyć:

"SHOW DATABASES LIKE 'DBname'"

jak już wspomniano wcześniej.


1

Oto mój sposób na zrobienie tego w skrypcie bash:

#!/bin/sh

DATABASE_USER=*****
DATABASE_PWD=*****
DATABASE_NAME=my_database

if mysql -u$DATABASE_USER -p$DATABASE_PWD -e "use $DATABASE_NAME";
then
echo "Database $DATABASE_NAME already exists. Exiting."
exit
else
echo Create database
mysql -u$DATABASE_USER -p$DATABASE_PWD -e "CREATE DATABASE $DATABASE_NAME"
fi

0

Dla mnie zadziałało następujące rozwiązanie:

mysql -u${MYSQL_USER} -p${MYSQL_PASSWORD} \
-s -N -e "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME='${MYSQL_DATABASE}'"

0

Kolejne rozwiązanie php, ale z PDO:

<?php
try {
   $pdo = new PDO('mysql:host=localhost;dbname=dbname', 'root', 'password');
   echo 'table dbname exists...';
}
catch (PDOException $e) {
   die('dbname not found...');
}

0

Rozwiązanie Golang

utwórz pakiet testowy i dodaj:

import "database/sql"

// testing database creation
func TestCreate(t *testing.T){
    Createdb("*Testdb") // This just calls the **sql.DB obect *Testdb 
    db,err := sql.Open("mysql", "root:root@tcp(127.0.0.1:3306)/*Testdb")
    if err != nil{
        panic(err)
    }
    defer db.Close()
    _, err = db.Exec("USE *Testdb")
    if err != nil{
        t.Error("Database not Created")
    }

} 

0

Zachowaj ostrożność podczas sprawdzania istnienia za pomocą podobnego stwierdzenia!

Jeśli w serii niefortunnych zdarzeń twoja zmienna będzie pusta i wykonasz to:

SHOW DATABASES like '' -- dangerous!

Zwróci WSZYSTKIE bazy danych, informując w ten sposób skrypt wywołujący, że istnieje, ponieważ niektóre wiersze zostały zwrócone.

O wiele bezpieczniejszym i lepszym rozwiązaniem jest używanie znaku równości „=” do testowania istnienia.

Prawidłowym i bezpiecznym sposobem sprawdzenia istnienia jest:

SHOW DATABASES WHERE `database` = 'xxxxx' -- safe way to test for existence

Zauważ, że musisz owinąć bazę danych nazw kolumn backtickami, w tym przypadku nie można użyć swobodnej składni.

W ten sposób, jeśli kod tworzący zmienną „xxxxx” zwróci pusty, wówczas POKAŻ BAZY DANYCH nie zwróci WSZYSTKICH baz danych, ale zwróci pusty zestaw.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.