2009-05-08 19 views
205

Ist es möglich, nach dem Herstellen einer Verbindung zu prüfen, ob eine (MySQL-) Datenbank existiert?Wie überprüft man, ob eine MySQL-Datenbank existiert

Ich weiß, wie man überprüft, ob eine Tabelle in einem DB existiert, aber ich muss überprüfen, ob der DB existiert. Wenn nicht, muss ich einen anderen Code aufrufen, um ihn zu erstellen und zu füllen.

Ich weiß, das klingt alles etwas unelegant - das ist eine schnelle und dreckige App.

Antwort

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

Wenn Sie nur wissen müssen, wenn ein db so existiert Sie keinen Fehler, wenn Sie versuchen, es zu erstellen, verwenden Sie einfach (Von here):

CREATE DATABASE IF NOT EXISTS DBName; 
+8

Erste gut. Der zweite ist nicht so viel. Möglicherweise verfügen Sie nicht über die Berechtigung zum Erstellen von Datenbanken. –

+14

@OllieJones zweite ist auch gut, der Beantworter nimmt an, wenn OP eine Datenbank erstellen möchte – nawfal

+2

Warum ist "INFORMATION_SCHEMA" in Großbuchstaben? Bei mir ist es in ganz Kleinbuchstaben – Hubro

20

Wenn Sie nach einem PHP-Skript suchen, siehe unten.

$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 Code:

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 existieren, existieren entos_development1 nicht

15

Von der Shell wie 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

Dies funktioniert nicht wirklich ... Stattdessen versuchen Sie etwas wie: ' result = $ (mysql -s-N-e" SELECT SCHEMA_NAME AUS INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'db' "); if [-z "$ result"]; dann echo "db existiert nicht"; fi –

+1

@ StevenGreens Anpassung funktioniert gut, also +1 für das Bash/Sql-Snippet. – Bobble

+0

Vergessen Sie nicht, Ihre Benutzerinformationen entweder in der Befehlszeile oder über .my.cnf anzugeben. –

78

Ein einfacher Weg, wenn eine Datenbank vorhanden zu überprüfen ist:

SHOW DATABASES LIKE 'dbname'; 

Wenn Datenbank mit dem Namen ‚dbname‘ nicht existiert, können Sie eine leere bekommen einstellen. Wenn es existiert, erhalten Sie eine Zeile.

+1

Arbeitete besser als die Lösung markiert korrekt. Danke] –

+1

Diese Methode ist langsamer als die angenommene Antwort – CIRCLE

+0

Offizielle Informationen, die diese gute Antwort erklären, finden Sie auf der Dokumentationsseite der offiziellen Website über den Befehl: http://dev.mysql.com/doc/refman/5.5/en/ show-databases.html (eine nützliche Tutorialseite führte mich dazu, http://dev.mysql.com/doc/refman/5.5/en/database-use.html ("MySQL 5.5 Referenzhandbuch/Tutorial/Erstellen und Verwenden eine Datenbank"). – Edward

8

Hier ist eine bash-Funktion zum Überprüfen, ob eine Datenbank vorhanden ist:

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 
}   

Eine weitere Alternative ist nur versuchen, die Datenbank zu verwenden. Beachten Sie, dass diese Berechtigung überprüft auch:

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 für die Alternative, aber '>/dev/null' garantiert, dass das Ergebnis immer null ist. Versuchen Sie etwas wie 'if [-z "$ (mysql $ {db} 2> & 1 Bobble

+0

@Bobble Das '>/dev/null' ändert nicht den Exit-Code von 'mysql'. Es verbirgt nur die Ausgabe, wenn ein Fehler vorliegt. Das 'wenn ...; then 'part überprüft den Exit-Code. –

+0

Whoops meine schlechte :) – 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 

Wenn Sie MSSQL statt MySQL verwenden, finden Sie diese answer from a similar thread.

+0

Dies ist für MSSQL, nicht MySQL –

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

eine andere beste Weg, wenn ein dabtabse besteht zu prüfen ist:

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

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

, dass die Methode, die ich überprüfen verwenden, um immer, wenn Datenbank vorhanden ist ....

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

die Sprache ist PHP – ceed

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

Folgende Lösung funktionierte für mich:

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

Lange, gewunden und gewunden (aber mit mir!), Hier ist ein Klasse-System, das ich gemacht zu überprüfen, ob ein DB vorhanden ist und auch die Tabellen erstellen benötigt:

<?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; 
    } 
} 

In dieser Sie den Namen der Datenbank en mit jeder Datenbank Namen, den Sie mögen und ändern auch die Schöpfer ersetzen Skript zu irgendetwas überhaupt und (hoffentlich!) wird es nicht brechen. Wenn jemand das verbessern kann, lass es mich wissen!

Hinweis
Wenn Sie Visual Studio nicht mit einem Werkzeug mit PHP nutzen, sorgen Sie sich nicht über die Regionen, sind sie für sie Code-Folding: P

4

Mit 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

Für diejenigen, die PHP mit mysqli verwenden, dann ist dies meine Lösung. Ich weiß, dass die Antwort bereits beantwortet wurde, aber ich dachte, dass es hilfreich wäre, die Antwort auch als eine mysqli vorbereitete Aussage zu haben.

$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

Ein sehr einfacher BASH-Einzeiler:

mysqlshow | grep dbname 
0

ich verwende einfach die folgende Abfrage:

"USE 'DBname'" 

Dann überprüfen, ob das Ergebnis falsch ist. Andernfalls könnte ein Zugriff verweigert Fehler sein, aber ich kann das nicht wissen. So beteiligt bei Privilegien, kann man verwenden:

"SHOW DATABASES LIKE 'DBname'" 

wie bereits früher erwähnt.

Verwandte Themen