So überprüfen Sie, ob eine MySQL-Datenbank vorhanden ist

292

Ist es möglich zu überprüfen, ob eine (MySQL) Datenbank vorhanden ist, nachdem eine Verbindung hergestellt wurde?

Ich kann überprüfen, ob eine Tabelle in einer Datenbank vorhanden ist, muss jedoch überprüfen, ob die Datenbank vorhanden ist. Wenn nicht, muss ich einen anderen Code aufrufen, um ihn zu erstellen und zu füllen.

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

Ankur
quelle

Antworten:

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

Wenn Sie nur wissen müssen, ob eine Datenbank vorhanden ist, damit beim Versuch, sie zu erstellen, keine Fehlermeldung angezeigt wird, verwenden Sie einfach (Von hier ):

CREATE DATABASE IF NOT EXISTS DBName;
Kirtan
quelle
9
Erster gut. Zweiter nicht so sehr. Möglicherweise haben Sie keine Berechtigung zum Erstellen von Datenbanken.
O. Jones
21
@OllieJones zweite ist auch gut, der Antwortende geht davon aus, ob OP eine Datenbank erstellen will
nawfal
3
Warum ist "INFORMATION_SCHEMA" in Großbuchstaben? Bei mir ist es in Kleinbuchstaben
Hubro
3
* OK, anscheinend zeigt PHPMyAdmin nur alle Datenbanknamen in Kleinbuchstaben an, und Ihre Abfrage funktioniert sowieso mit beiden
Hubro
1
Stimmen Sie mit @nawfal überein; Ich möchte die Datenbank möglicherweise nicht erstellen, sondern nur wissen, ob sie vorhanden ist.
SteveCinq
122

Eine einfache Möglichkeit, um zu überprüfen, ob eine Datenbank vorhanden ist, ist:

SHOW DATABASES LIKE 'dbname';

Wenn keine Datenbank mit dem Namen 'Datenbankname' vorhanden ist, erhalten Sie einen leeren Satz. Wenn es existiert, erhalten Sie eine Zeile.

Ruben Konig
quelle
1
Funktionierte besser als die als korrekt markierte Lösung. Danke]
John Williams
Offizielle Informationen, die diese gute Antwort erklären, finden Sie auf der Dokumentationsseite der offiziellen Website zum Befehl: dev.mysql.com/doc/refman/5.5/en/show-databases.html (eine nützliche Tutorial-Seite hat mich dazu geführt, dev .mysql.com / doc / refman / 5.5 / de / database-use.html ("MySQL 5.5 Referenzhandbuch / Tutorial / Erstellen und Verwenden einer Datenbank")
Edward
2
Dies ist möglicherweise langsamer als die direkte Abfrage von INFORMATION_SCHEMA, aber es ist viel besser lesbar und leicht zu verstehen, was in meinem Fall die wichtigere Überlegung war.
Daniel Howard
Dies ist eine bessere Lösung, denn wenn Sie die Existenz einer Datenbank testen, möchten Sie diese möglicherweise erstellen. Das "Datenbank erstellen, wenn nicht vorhanden" ist ärgerlich, da, wenn die Datenbank vorhanden ist, der folgende Code zum Definieren von Tabellen bombardiert wird. Ich kann nicht sehen, wie nützlich der Befehl ist.
Keir
@Keir Obwohl es ärgerlich erscheinen mag, stellen Sie sich zwei Threads vor, die versuchen, dieselbe Datenbank gleichzeitig zu erstellen, und was passieren würde, wenn einer fehlschlägt. Es ist zwar nicht hilfreich, um festzustellen, ob eine Datenbank vorhanden ist, bevor Sie versuchen, sie zu erstellen, aber es ist nützlich, um Kollisionen zu verhindern, während mehrere Threads möglicherweise versuchen, sie zu erstellen.
Brogan
22

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());
}
TopPot
quelle
22

Aus der Schale 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
AskApache Webmaster
quelle
3
Dies funktioniert nicht wirklich ... Versuchen Sie stattdessen Folgendes: `result = $ (mysql -s -N -e" SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'db' "); if [-z "$ result"]; dann echo "db existiert nicht"; fi
Steven Green
1
@ StevenGreens Anpassung funktioniert gut, also +1 für das Bash / SQL-Snippet.
Bobble
Vergessen Sie nicht, Ihre Benutzerdaten entweder in der Befehlszeile oder über .my.cnf anzugeben.
Herr Goobri
11

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 andere Alternative besteht darin, einfach zu versuchen, die Datenbank zu verwenden. Beachten Sie, dass dies auch die Berechtigung überprüft:

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
docwhat
quelle
+1 für die Alternative, >/dev/nullgarantiert aber , dass das Ergebnis immer null ist. Versuchen Sie etwas wie if [ -z "$(mysql ${db} 2>&1 </dev/null)" ]; then ....
Bobble
@Bobble Das >/dev/nulländert nicht, dass der Exit-Code ausgeführt wird mysql. Die Ausgabe wird nur ausgeblendet, wenn ein Fehler auftritt. Das if ...; thenTeil überprüft den Exit-Code.
docwhat
9

Eine gute Möglichkeit, um zu überprüfen, ob eine Datenbank in PHP vorhanden ist, ist:

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

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

Das ist die Methode, die ich immer benutze.

Junaid Saleem
quelle
7

Ein sehr einfacher BASH-One-Liner:

mysqlshow | grep dbname
andiba
quelle
5
CREATE SCHEMA IF NOT EXISTS `demodb` DEFAULT CHARACTER SET utf8 ;
jprism
quelle
4
SELECT IF('database_name' IN(SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA), 1, 0) AS found;
Alex
quelle
4

Für diejenigen, die PHP mit MySQL verwenden, ist dies meine Lösung. Ich weiß, dass die Antwort bereits beantwortet wurde, aber ich dachte, es wäre hilfreich, die Antwort auch als von mysqli vorbereitete Erklärung 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();
Thomas Williams
quelle
4

Bash verwenden:

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
inemanja
quelle
2

Langwierig und verschlungen (aber ertrage es mit mir!), Hier ist ein Klassensystem, das ich erstellt habe, um zu überprüfen, ob eine Datenbank vorhanden ist, und um auch die erforderlichen Tabellen zu erstellen:

<?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 diesem Fall können Sie den Datenbanknamen endurch einen beliebigen Datenbanknamen ersetzen und das Erstellungsskript in etwas ändern, das (hoffentlich!) Nicht beschädigt wird. Wenn jemand dies verbessern kann, lass es mich wissen!

Hinweis
Wenn Sie Visual Studio nicht mit PHP-Tools verwenden, sorgen Sie sich nicht um die Regionen, sondern um das Falten von Code: P.

Kann O 'Spam
quelle
2

Mit diesem Skript können Sie feststellen, dass eine Ja- oder Nein-Datenbank vorhanden ist. Falls diese nicht vorhanden ist, wird keine Ausnahme ausgelöst.

SELECT 
    IF(EXISTS( SELECT 
                SCHEMA_NAME
            FROM
                INFORMATION_SCHEMA.SCHEMATA
            WHERE
                SCHEMA_NAME = 'DbName'),
        'Yes',
        'No')  as exist
Einfädeln
quelle
1

Schienencode:

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

wxianfeng
quelle
1
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 anstelle von MySQL verwenden, lesen Sie diese Antwort aus einem ähnlichen Thread .

tödlicher Hund
quelle
Dies ist für MSSQL, nicht MySQL
Erin Drummond
1

Ich benutze einfach die folgende Abfrage:

"USE 'DBname'"

Überprüfen Sie dann, ob das Ergebnis FALSE ist. Andernfalls liegt möglicherweise ein Fehler bei der Zugriffsverweigerung vor, aber das kann ich nicht wissen. Im Falle von Privilegien kann man also verwenden:

"SHOW DATABASES LIKE 'DBname'"

wie bereits erwähnt.

Apostolos
quelle
1

Hier ist meine Vorgehensweise in einem Bash-Skript:

#!/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
Theo Balkwill
quelle
0

Folgende Lösung hat bei mir funktioniert:

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

Eine andere PHP-Lösung, aber mit PDO:

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

Golang-Lösung

Erstellen Sie ein Testpaket und fügen Sie hinzu:

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")
    }

} 
Damunza
quelle
0

Seien Sie vorsichtig, wenn Sie mit einer ähnlichen Aussage auf Existenz prüfen!

Wenn in einer Reihe unglücklicher Ereignisse Ihre Variable leer ist und Sie am Ende Folgendes ausführen:

SHOW DATABASES like '' -- dangerous!

Es gibt ALLE Datenbanken zurück und teilt dem aufrufenden Skript mit, dass es existiert, seit einige Zeilen zurückgegeben wurden.

Es ist viel sicherer und besser, ein Gleichheitszeichen "=" zu verwenden, um die Existenz zu testen.

Der richtige und sichere Weg, um seine Existenz zu testen, sollte sein:

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

Beachten Sie, dass Sie die Spaltennamendatenbank mit Backticks umschließen müssen. In diesem Fall kann keine entspannte Syntax verwendet werden.

Auf diese Weise gibt SHOW DATABASES nicht ALLE Datenbanken zurück, wenn der Code, der die Variable 'xxxxx' erstellt, leer ist, sondern eine leere Menge.

Wadih M.
quelle