Come verificare se esiste il database mysql


292

È possibile verificare l'esistenza di un database (MySQL) dopo aver effettuato una connessione.

So come verificare se esiste una tabella in un DB, ma devo verificare se il DB esiste. Altrimenti devo chiamare un altro pezzo di codice per crearlo e popolarlo.

So che tutto ciò suona un po 'inelegante - questa è un'app veloce e sporca.

Risposte:


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

Se hai solo bisogno di sapere se esiste un db in modo da non ricevere un errore quando provi a crearlo, usa semplicemente (Da qui ):

CREATE DATABASE IF NOT EXISTS DBName;

9
Primo buono. Secondo non tanto. Potresti non avere il privilegio di creazione del database.
O. Jones,

21
Anche il secondo @OllieJones è buono, il risponditore sta assumendo se OP vuole creare un database
nawfal

3
Perché "INFORMATION_SCHEMA" è in maiuscolo? Con me è tutto in minuscolo
Hubro,

3
* OK, apparentemente PHPMyAdmin mostra solo tutti i nomi di database in minuscolo e la tua query funziona comunque usando entrambi
Hubro

1
Accetto con @nawfal; Potrei non voler creare il DB, so solo se esiste.
SteveCinq,

122

Un modo semplice per verificare l'esistenza di un database è:

SHOW DATABASES LIKE 'dbname';

Se non esiste un database con il nome "dbname", si ottiene un set vuoto. Se esiste, ottieni una riga.


1
Ha funzionato meglio della soluzione contrassegnata come corretta. Grazie]
John williams,

Per informazioni ufficiali che spiegano questa buona risposta, vai alla pagina di documentazione del sito ufficiale sul comando: dev.mysql.com/doc/refman/5.5/it/show-d Database.html (un'utile pagina tutorial mi ha portato ad esso, dev .mysql.com / doc / refman / 5.5 / it / database-use.html ("Manuale di riferimento di MySQL 5.5 / Tutorial / Creazione e utilizzo di un database").
Edward

2
Potrebbe essere più lento rispetto alla richiesta diretta di INFORMATION_SCHEMA, ma è molto più leggibile e di facile comprensione, che è stata la considerazione più importante nel mio caso.
Daniel Howard,

Questa è una soluzione migliore perché se si verifica l'esistenza di un database, è possibile crearlo. Il "creare database se non esiste" è fastidioso perché se il database esiste, qualsiasi codice seguente per definire le tabelle bombarderà. Non riesco a vedere come il comando sia utile.
Keir,

@Keir Anche se può sembrare fastidioso, immagina due thread che provano a creare lo stesso database contemporaneamente e cosa succederebbe se uno fallisse. Sebbene non sia utile per determinare se esiste un database prima di provare a crearlo, è utile per prevenire le collisioni mentre più thread potrebbero tentare di crearlo.
Brogan,

22

Se stai cercando uno script php vedi sotto.

$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

Dal guscio come 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
In realtà non funziona ... Invece prova qualcosa del tipo: `result = $ (mysql -s -N -e" SELEZIONA SCHEMA_NAME DA INFORMATION_SCHEMA.SCHEMATA DOVE SCHEMA_NAME = 'db' "); if [-z "$ result"]; quindi l'eco "db non esiste"; fi
Steven Green,

1
L'adattamento di @ StevenGreen di questo funziona benissimo, quindi +1 per lo snippet bash / sql.
Bobble,

Non dimenticare di includere i dettagli dell'utente, dalla riga di comando o tramite .my.cnf.
Mr Goobri,

11

Ecco una funzione bash per verificare l'esistenza di un database:

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
}           

Un'altra alternativa è semplicemente provare a utilizzare il database. Si noti che anche questo controlla l'autorizzazione:

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 per l'alternativa, ma >/dev/nullgarantisce che il risultato sia sempre nullo. Prova qualcosa del genere if [ -z "$(mysql ${db} 2>&1 </dev/null)" ]; then ....
Bobble,

@Bobble Il >/dev/nullnon modifica l'esecuzione del codice di uscita mysql. Nasconde semplicemente l'output in caso di errore. La if ...; thenparte controlla il codice di uscita.
docwhat,

9

Un ottimo modo per verificare se esiste un database in PHP è:

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

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

Questo è il metodo che uso sempre.


7

Un BASH-one-liner molto semplice:

mysqlshow | grep dbname

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

Per coloro che usano php con mysqli, questa è la mia soluzione. So che la risposta ha già ricevuto risposta, ma ho pensato che sarebbe stato utile avere la risposta anche come una dichiarazione preparata da 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

Usando 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

Lunga e tortuosa (ma abbiate pazienza!), Ecco un sistema di classe che ho creato per verificare l'esistenza di un DB e anche per creare le tabelle richieste:

<?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 questo puoi sostituire il nome del database encon qualsiasi nome di database ti piaccia e anche cambiare lo script del creatore in qualsiasi cosa e (si spera!) Non lo spezzerà. Se qualcuno può migliorare questo, fammi sapere!

Nota
Se non usi Visual Studio con strumenti PHP, non preoccuparti delle regioni, sono loro per la piegatura del codice: P


2

Con questo script è possibile ottenere il database Sì o No, nel caso in cui non esista non genera Eccezione.

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

1

Codice rotaie:

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 esiste, entos_development1 non esiste


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

Se stai usando MSSQL invece di MySQL, vedi questa risposta da un thread simile .


Questo è per MSSQL, non MySQL
Erin Drummond,

1

Sto usando semplicemente la seguente query:

"USE 'DBname'"

Quindi controlla se il risultato è FALSO. Altrimenti, potrebbe esserci un errore di accesso negato, ma non posso saperlo. Quindi, in caso di privilegi coinvolti, si può usare:

"SHOW DATABASES LIKE 'DBname'"

come già accennato in precedenza.


1

Ecco il mio modo di farlo all'interno di uno script 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

La seguente soluzione ha funzionato per me:

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

0

Un'altra soluzione php, ma con DOP:

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

0

Soluzione Golang

crea un pacchetto di test e aggiungi:

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

Fai attenzione quando controlli l'esistenza con un'affermazione simile!

Se in una serie di sfortunati eventi la tua variabile finisce per essere vuota, e finisci per eseguire questo:

SHOW DATABASES like '' -- dangerous!

Restituirà TUTTI i database, comunicando così allo script chiamante che esiste da quando sono state restituite alcune righe.

È molto più sicuro e migliore pratica usare un segno di uguale "=" per verificare l'esistenza.

Il modo corretto e sicuro per verificare l'esistenza deve essere:

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

Si noti che è necessario racchiudere il database dei nomi di colonna con i backtick, in questo caso non è possibile utilizzare la sintassi semplificata.

In questo modo, se il codice che crea la variabile 'xxxxx' è tornato vuoto, SHOW DATABASES non restituirà TUTTI i database, ma restituirà un set vuoto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.