2009-05-08 23 views
205

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

W jaki sposób sprawdzić, czy tabela istnieje w DB, ale muszę sprawdzić, czy DB istnieje. Jeśli nie, muszę zadzwonić do innego fragmentu kodu, aby go utworzyć i wypełnić.

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

Odpowiedz

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

Jeśli wystarczy wiedzieć, czy db istnieje, więc nie będzie się błąd podczas próby, aby go utworzyć, wystarczy użyć (Z here):

CREATE DATABASE IF NOT EXISTS DBName; 
+8

Pierwsza dobra. Drugi nie tyle. Być może nie masz uprawnień do tworzenia baz danych. –

+14

@OllieJones drugi też jest dobry, odbierający zakłada, że ​​jeśli OP chce stworzyć bazę danych – nawfal

+2

Dlaczego "INFORMATION_SCHEMA" we wszystkich wersjach jest? U mnie jest we wszystkich małych literach. – Hubro

20

Jeśli szukasz skryptu php, patrz 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()); 
} 
1

Rails Kod:

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, nie istnieją

entos_development1 10
15

z powłoki bash jak

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 nie działa ... Zamiast tego spróbuj czegoś takiego:' result = $ (mysql -s -N -e " WYBIERZ SCHEMA_NAME Z INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'db' "); if [-z "$ result"]; następnie echo "db nie istnieje"; fi –

+1

@ Dostosowanie StevenGreen to działa dobrze, więc +1 dla bash/sql snippet. – Bobble

+0

Nie zapomnij podać szczegółów użytkownika, korzystając z wiersza poleceń lub pliku .my.cnf. –

78

prosty sposób sprawdzić, czy baza danych istnieje, jest:

SHOW DATABASES LIKE 'dbname'; 

Jeśli baza danych o nazwie „dbname” nie istnieje, pojawi się pusta zestaw. Jeśli istnieje, otrzymujesz jeden wiersz.

+1

Pracował lepiej niż rozwiązanie oznaczone jako poprawne. Dzięki] –

+1

Ta metoda jest wolniejsza niż przyjęta odpowiedź. – CIRCLE

+0

Oficjalne informacje wyjaśniające tę dobrą odpowiedź można znaleźć na oficjalnej stronie dokumentacji dotyczącej polecenia: http://dev.mysql.com/doc/refman/5.5/en/ show-databases.html (przydatna strona samouczka poprowadziła mnie do niego, http://dev.mysql.com/doc/refman/5.5/en/database-use.html ("MySQL 5.5 Reference Manual/Tutorial/Creating and Using Baza danych "). – Edward

8

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 tylko próbować korzystać z bazy danych. Zauważ, że ta sprawdza uprawnienia, a także:

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 
+0

+1 dla alternatywy, ale '>/dev/null' gwarantuje, że wynik jest zawsze pusty. Spróbuj czegoś takiego jak 'if [-z" $ (mysql $ {db} 2> & 1 Bobble

+0

@Bobble '>/dev/null' nie zmienia kodu wyjścia od uruchamiania' mysql'. Po prostu ukrywa wyjście, jeśli wystąpił błąd. 'If ​​...; następnie część sprawdza kod wyjścia. –

+0

Whoops my bad :) – Bobble

2
IF EXISTS (SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = N'YourDatabaseName') 
BEGIN  
    -- Database exists, so do your stuff here. 
END 

Jeśli używasz MSSQL zamiast MySQL, zobacz ten answer from a similar thread.

+0

To jest dla MSSQL, nie MySQL –

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

kolejny najlepszy sposób na sprawdzenie, czy istnieje dabtabse jest:

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

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

To jest metoda, która zawsze używam do sprawdzenia, czy baza danych istnieje ....

echo "rate if you enjoy :)"; 
+1

językiem jest php – ceed

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

Następujące rozwiązanie działa dla mnie:

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

Długo zdyszany i zawiłowany (ale daj mi spokój!), Tutaj jest to system klasy I w celu sprawdzenia, czy DB istnieje i również tworzyć tabele wymagane:

<?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 ten można zastąpić nazwę bazy danych en z dowolnej bazy danych nazwa lubisz, a także zmienić twórcę skrypt do czegokolwiek i (miejmy nadzieję!) to go nie złamie. Jeśli ktokolwiek może to poprawić, daj mi znać!

Uwaga
Jeśli nie korzystać z narzędzi Visual Studio PHP, nie martw się o regionach, są one dla zwijania kodu: P

4

Korzystanie 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 
3

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 byłoby pomocne uzyskanie odpowiedzi również w formie przygotowanej 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(); 
2

Bardzo prosty BASH-one-liner:

mysqlshow | grep dbname 
0

używam po prostu następujące zapytanie:

"USE 'DBname'" 

Następnie sprawdzić, czy wynik jest fałszywy. W przeciwnym razie może wystąpić błąd odmowy dostępu, ale nie mogę o tym wiedzieć. Tak więc, w przypadku przywilejów związanych, można użyć:

"SHOW DATABASES LIKE 'DBname'" 

jak już wspomniano wcześniej.

Powiązane problemy