Como verificar se o banco de dados mysql existe


292

É possível verificar se existe um banco de dados (MySQL) após a conexão.

Eu sei como verificar se existe uma tabela em um banco de dados, mas preciso verificar se o banco de dados existe. Caso contrário, tenho que chamar outro pedaço de código para criá-lo e preenchê-lo.

Eu sei que tudo isso parece um pouco deselegante - este é um aplicativo rápido e sujo.

Respostas:


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

Se você só precisa saber se um db existe para que você não receberá um erro quando você tenta para criá-lo, basta usar (De aqui ):

CREATE DATABASE IF NOT EXISTS DBName;

9
Primeiro bom. Segundo, nem tanto. Você pode não ter privilégio de criação de banco de dados.
O. Jones

21
@OllieJones segundo é muito bom, o respondente está assumindo se OP quer criar um banco de dados
Nawfal

3
Por que "Information_SCHEMA" está em maiúsculas? Comigo é em todas as letras minúsculas
Hubro

3
* OK, aparentemente PHPMyAdmin apenas exibe todos os nomes de banco de dados em letras minúsculas, e sua consulta funciona usando tanto de qualquer maneira
Hubro

1
Concorde com @nawfal; Talvez eu não queira criar o banco de dados, apenas sei se ele existe.
SteveCinq

122

Uma maneira simples de verificar se existe um banco de dados é:

SHOW DATABASES LIKE 'dbname';

Se o banco de dados com o nome 'dbname' não existir, você receberá um conjunto vazio. Se existir, você recebe uma linha.


1
Funcionou melhor do que a solução marcada como correta. Obrigado]
John williams

Para obter informações oficiais que explicam essa boa resposta, acesse a página de documentação do site oficial sobre o comando: dev.mysql.com/doc/refman/5.5/en/show-databases.html (uma página útil do tutorial me levou a ele, dev .mysql.com / doc / refman / 5.5 / pt / database-use.html ("Manual de referência do MySQL 5.5 / Tutorial / Criando e usando um banco de dados").
Edward

2
Isso pode ser mais lento do que consultar diretamente o INFORMATION_SCHEMA, mas é muito mais legível e fácil de entender, o que foi a consideração mais importante no meu caso.
9789 Daniel Howard

Esta é uma solução melhor porque, se você testar a existência de um banco de dados, poderá criá-lo. O "criar banco de dados se não existir" é irritante porque, se o banco de dados existir, qualquer código a seguir para definir tabelas será bombardeado. Não vejo como o comando é útil.
Keir

@ Keir Embora pareça irritante, imagine dois threads tentando criar o mesmo banco de dados ao mesmo tempo e o que aconteceria se um falhasse. Embora não seja útil para determinar se um banco de dados existe antes de tentar criá-lo, é útil para evitar colisões, enquanto vários threads podem estar tentando criá-lo.
Brogan

22

Se você está procurando um script php, veja abaixo.

$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

A partir do shell 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

3
Na verdade, isso não funciona ... Em vez disso, tente algo como: `result = $ (mysql -s -N -e" SELECIONE SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'db' "); if [-z "$ result"]; então echo "db não existe"; fi
Steven Green

1
@ A adaptação feita por StevenGreen funciona bem, então +1 para o snippet bash / sql.
Bobble

Não se esqueça de incluir os detalhes do usuário, na linha de comando ou via .my.cnf.
Sr. Goobri

11

Aqui está uma função bash para verificar se existe um banco de dados:

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
}           

Outra alternativa é apenas tentar usar o banco de dados. Observe que isso também verifica a permissão:

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 para a alternativa, mas >/dev/nullgarante que o resultado seja sempre nulo. Tente algo parecido if [ -z "$(mysql ${db} 2>&1 </dev/null)" ]; then ....
Bobble

@ Bobble O >/dev/nullnão altera o código de saída de execução mysql. Apenas oculta a saída se houver um erro. A if ...; thenpeça verifica o código de saída.
docwhat

9

Uma ótima maneira de verificar se existe um banco de dados no PHP é:

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

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

Esse é o método que eu sempre uso.


7

Um BASH-one-liner muito simples:

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

Para quem usa php com mysqli, então esta é a minha solução. Eu sei que a resposta já foi respondida, mas achei que seria útil ter a resposta como uma declaração preparada para o mysqli também.

$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 o 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

Por muito tempo e complicado (mas tenha paciência comigo!), Aqui está um sistema de classe que fiz para verificar se existe um banco de dados e também para criar as tabelas necessárias:

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

Neste você pode substituir o nome do banco de dados en por qualquer nome de banco de dados que desejar e também alterar o script do criador para qualquer coisa e (espero!) Não o quebrará. Se alguém puder melhorar isso, me avise!

Nota
Se você não usar o Visual Studio com ferramentas PHP, não se preocupe com as regiões, elas são para dobrar códigos: P


2

Com esse script, é possível obter o banco de dados Sim ou Não, caso ele não exista, não gera Exceção.

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

1

Código Rails:

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 não existe


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 você estiver usando o MSSQL em vez do MySQL, consulte esta resposta em um thread semelhante .


Isto é para MSSQL, não MySQL
Erin Drummond

1

Estou usando simplesmente a seguinte consulta:

"USE 'DBname'"

Depois verifique se o resultado é FALSO. Caso contrário, pode haver um erro de acesso negado, mas não sei. Portanto, no caso de privilégios envolvidos, pode-se usar:

"SHOW DATABASES LIKE 'DBname'"

como já mencionado anteriormente.


1

Aqui está a minha maneira de fazê-lo dentro de um 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

A seguinte solução funcionou para mim:

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

0

Outra solução php, mas com 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

Solução Golang

crie um pacote de teste e adicione:

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

Tenha cuidado ao verificar a existência com uma declaração like!

Se em uma série de eventos infelizes sua variável acaba vazia, e você acaba executando isso:

SHOW DATABASES like '' -- dangerous!

Ele retornará TODOS os bancos de dados, informando ao script de chamada que ele existe desde que algumas linhas foram retornadas.

É uma prática muito mais segura e melhor usar um sinal de igual "=" para testar a existência.

A maneira correta e segura de testar a existência deve ser:

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

Observe que você precisa agrupar o banco de dados de nomes de colunas com reticulares; nesse caso, não é possível usar sintaxe relaxada.

Dessa forma, se o código que cria a variável 'xxxxx' retornar em branco, o SHOW DATABASES não retornará TODOS os bancos de dados, mas retornará um conjunto vazio.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.