Cómo verificar si existe una base de datos mysql

292

¿Es posible verificar si existe una base de datos (MySQL) después de haber realizado una conexión?

Sé cómo verificar si existe una tabla en una base de datos, pero necesito verificar si la base de datos existe. Si no, tengo que llamar a otro código para crearlo y completarlo.

Sé que todo esto suena poco elegante: esta es una aplicación rápida y sucia.

Ankur
fuente

Respuestas:

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

Si solo necesita saber si existe un db para que no reciba un error cuando intente crearlo, simplemente use (Desde aquí ):

CREATE DATABASE IF NOT EXISTS DBName;
Kirtan
fuente
99
Primero uno bueno. El segundo no tanto. Es posible que no tenga el privilegio de creación de base de datos.
O. Jones
21
@OllieJones segundo es bueno también, el contestador está asumiendo si OP quiere crear una base de datos
nawfal
3
¿Por qué es "INFORMATION_SCHEMA" en mayúsculas? Conmigo todo en minúscula
Hubro
3
* OK, aparentemente PHPMyAdmin solo muestra todos los nombres de bases de datos en minúsculas, y su consulta funciona con ambos de todos modos
Hubro
1
De acuerdo con @nawfal; Es posible que no quiera crear la base de datos, solo sé si existe.
SteveCinq
122

Una forma simple de verificar si existe una base de datos es:

SHOW DATABASES LIKE 'dbname';

Si la base de datos con el nombre 'dbname' no existe, obtendrá un conjunto vacío. Si existe, obtienes una fila.

Ruben Konig
fuente
1
Funcionó mejor que la solución marcada correcta. Gracias]
John williams
Para obtener información oficial que explique esta buena respuesta, vaya a la página de documentación del sitio web oficial sobre el comando: dev.mysql.com/doc/refman/5.5/en/show-databases.html (una útil página de tutorial me llevó a ello, dev .mysql.com / doc / refman / 5.5 / es / database-use.html ("Manual de referencia MySQL 5.5 / Tutorial / Creación y uso de una base de datos").
Edward
2
Esto podría ser más lento que consultar directamente INFORMATION_SCHEMA, pero es mucho más legible y fácil de entender, lo cual fue la consideración más importante en mi caso.
Daniel Howard
Esta es una mejor solución porque si prueba la existencia de una base de datos, puede crearla. La "crear base de datos si no existe" es molesta porque si la base de datos existe, cualquier código siguiente para definir las tablas será una bomba. No puedo ver cómo el comando es útil.
Keir
@Keir Si bien puede parecer molesto, imagine dos hilos tratando de crear la misma base de datos al mismo tiempo y qué sucedería si uno fallara. Si bien no es útil para determinar si existe una base de datos antes de intentar crearla, es útil para evitar colisiones, mientras que varios subprocesos pueden estar intentando crearla.
Brogan
22

Si está buscando un script php, vea a continuación.

$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
fuente
22

Desde la cáscara como 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
fuente
3
En realidad, esto no funciona ... En su lugar, intente algo como: `result = $ (mysql -s -N -e" SELECCIONE SCHAME_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'db' "); si [-z "$ resultado"]; entonces echo "db no existe"; fi
Steven Green
1
La adaptación de @ StevenGreen de esto funciona bien, por lo que +1 para el fragmento bash / sql.
Bobble
No olvide incluir sus datos de usuario, ya sea en la línea de comandos o mediante .my.cnf.
Sr. Goobri
11

Aquí hay una función bash para verificar si existe una base de datos:

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
}           

Otra alternativa es tratar de usar la base de datos. Tenga en cuenta que esto también verifica el permiso:

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
fuente
+1 para la alternativa, pero >/dev/nullgarantiza que el resultado sea siempre nulo. Intenta algo como if [ -z "$(mysql ${db} 2>&1 </dev/null)" ]; then ....
Bobble
@Bobble The >/dev/nullno cambia el código de salida para que no se ejecute mysql. Simplemente oculta la salida si hay un error. La if ...; thenparte verifica el código de salida.
docwhat
9

Una excelente manera de verificar si existe una base de datos en PHP es:

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

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

Ese es el método que siempre uso.

Junaid Saleem
fuente
7

Un BASH-one-liner muy simple:

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

Para aquellos que usan php con mysqli, esta es mi solución. Sé que la respuesta ya ha sido respondida, pero pensé que sería útil tener la respuesta como una declaración preparada mysqli también.

$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
fuente
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
inemanja
fuente
2

Sin aliento y complicado (¡pero tengan paciencia conmigo!), Aquí hay un sistema de clases que hice para verificar si existe un DB y también para crear las tablas requeridas:

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

En esto, puede reemplazar el nombre de la base de datos encon cualquier nombre de base de datos que desee y también cambiar el script del creador a cualquier cosa y (¡con suerte!) No lo romperá. Si alguien puede mejorar esto, ¡hágamelo saber!

Nota
Si no usa Visual Studio con herramientas PHP, no se preocupe por las regiones, son para plegar el código: P

Can O 'Spam
fuente
2

Con este script, puede obtener la base de datos Sí o No, en caso de que no exista, no arroja Excepción.

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

Código de rieles:

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 existe, entos_development1 no existe

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

Si está utilizando MSSQL en lugar de MySQL, vea esta respuesta desde un hilo similar .

perro mortal
fuente
Esto es para MSSQL, no MySQL
Erin Drummond
1

Estoy usando simplemente la siguiente consulta:

"USE 'DBname'"

Luego verifique si el resultado es FALSO. De lo contrario, puede haber un error de acceso denegado, pero no puedo saberlo. Entonces, en caso de privilegios involucrados, uno puede usar:

"SHOW DATABASES LIKE 'DBname'"

como ya se mencionó anteriormente.

Apostolos
fuente
1

Aquí está mi forma de hacerlo dentro de un 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
Theo Balkwill
fuente
0

La siguiente solución funcionó para mí:

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

Otra solución php, pero con 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
fuente
0

Solución de Golang

cree un paquete de prueba y agregue:

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

¡Tenga cuidado al verificar la existencia con una declaración similar!

Si en una serie de eventos desafortunados su variable termina estando vacía y termina ejecutando esto:

SHOW DATABASES like '' -- dangerous!

Devolverá TODAS las bases de datos, indicando al script de llamada que existe desde que se devolvieron algunas filas.

Es mucho más seguro y una mejor práctica usar un signo igual "=" para probar la existencia.

La forma correcta y segura de probar la existencia debería ser:

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

Tenga en cuenta que debe envolver la base de datos de nombres de columnas con comillas inversas, en este caso no puede usar una sintaxis relajada.

De esta manera, si el código que crea la variable 'xxxxx' se vuelve en blanco, SHOW DATABASES no devolverá TODAS las bases de datos, pero devolverá un conjunto vacío.

Wadih M.
fuente