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.