Как проверить, существует ли база данных mysql


292

Можно ли проверить, существует ли база данных (MySQL) после установления соединения?

Я знаю, как проверить, существует ли таблица в БД, но мне нужно проверить, существует ли БД. Если нет, я должен вызвать другой кусок кода, чтобы создать его и заполнить его.

Я знаю, что все это звучит несколько не элегантно - это быстрое и грязное приложение.

Ответы:


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

Если вам просто нужно знать, существует ли база данных, чтобы при попытке ее создания не возникло ошибки, просто используйте ( Отсюда ):

CREATE DATABASE IF NOT EXISTS DBName;

9
Первый хороший. Второй не так уж и много. Возможно, у вас нет прав на создание базы данных.
О. Джонс

21
@OllieJones, второе тоже хорошо, ответчик предполагает, что OP хочет создать базу данных
nawfal

3
Почему "INFORMATION_SCHEMA" во всех заглавных буквах? Со мной это все в нижнем регистре
Hubro

3
* ОК, очевидно, PHPMyAdmin просто отображает все имена баз данных в нижнем регистре, и ваш запрос в любом случае работает с обоими
вариантами

1
Согласен с @nawfal; Возможно, я не хочу создавать БД, просто знаю, существует ли она.
SteveCinq

122

Простой способ проверить, существует ли база данных:

SHOW DATABASES LIKE 'dbname';

Если база данных с именем 'dbname' не существует, вы получаете пустой набор. Если он существует, вы получите один ряд.


1
Работал лучше, чем решение, помеченное как правильное. Спасибо]
Джон Уильямс

Для получения официальной информации, которая объясняет этот хороший ответ, перейдите на страницу документации официального сайта о команде: dev.mysql.com/doc/refman/5.5/en/show-databases.html (полезная учебная страница привела меня к этому, dev .mysql.com / doc / refman / 5.5 / en / database-use.html («Справочное руководство по MySQL 5.5 / Учебное пособие / Создание и использование базы данных»).
Эдвард

2
Это может быть медленнее, чем прямой запрос INFORMATION_SCHEMA, но это намного более читабельно и легко понять, что было более важным соображением в моем случае.
Даниэль Ховард

Это лучшее решение, потому что если вы проверяете наличие базы данных, вы можете захотеть ее создать. «Создать базу данных, если она не существует» раздражает, потому что, если база данных существует, любой следующий код для определения таблиц будет бомбить. Я не вижу, как команда полезна.
Кейр,

@Keir Хотя это может показаться раздражающим, представьте, что два потока пытаются создать одну и ту же базу данных одновременно и что произойдет, если один из них потерпит неудачу. Хотя это бесполезно для определения, существует ли база данных, прежде чем пытаться ее создать, это полезно для предотвращения коллизий, когда несколько потоков могут пытаться создать ее.
Броган

22

Если вы ищете PHP-скрипт, смотрите ниже.

$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

Из оболочки вроде баш

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
Это на самом деле не работает ... Вместо этого попробуйте что-то вроде: `result = $ (mysql -s -N -e" SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'db' "); if [-z "$ result"]; тогда эхо "db не существует"; фантастика
Стивен Грин

1
Адаптация @ StevenGreen этого прекрасно работает, поэтому +1 для фрагмента bash / sql.
Боббл

Не забудьте указать свои данные пользователя в командной строке или через .my.cnf.
Мистер Губри

11

Вот функция bash для проверки существования базы данных:

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
}           

Другая альтернатива - просто попытаться использовать базу данных. Обратите внимание, что это также проверяет разрешение:

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 для альтернативы, но >/dev/nullгарантирует, что результат всегда будет нулевым. Попробуйте что-то вроде if [ -z "$(mysql ${db} 2>&1 </dev/null)" ]; then ....
Bobble

@Bobble The >/dev/nullне меняет код выхода с запущенного mysql. Он просто скрывает вывод, если есть ошибка. if ...; thenЧасть проверяет код выхода.
Что

9

Отличный способ проверить, существует ли база данных в PHP:

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

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

Это метод, который я всегда использую.




4
SELECT IF('database_name' IN(SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA), 1, 0) AS found;

4

Для тех, кто использует PHP с MySQL, это мое решение. Я знаю, что на ответ уже получен ответ, но я подумал, что было бы полезно иметь ответ в виде подготовленного к MySQL запроса.

$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

Используя 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

Долго запутанный и запутанный (но потерпите меня!), Вот система классов, которую я сделал, чтобы проверить, существует ли БД, а также для создания необходимых таблиц:

<?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на любое имя базы данных, которое вам нравится, а также изменить сценарий создателя на что угодно, и (надеюсь!) Это не сломает его. Если кто-то может улучшить это, дайте мне знать!

Примечание.
Если вы не используете Visual Studio с инструментами PHP, не беспокойтесь о регионах, они для свертывания кода: P


2

С помощью этого скрипта вы можете получить Да или Нет, база данных существует, в случае, если она не существует, она не выдает исключение.

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

1

Код 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 существует, entos_development1 не существует



1

Я использую просто следующий запрос:

"USE 'DBname'"

Затем проверьте, если результат ЛОЖЬ. В противном случае может быть ошибка в доступе, но я не могу этого знать. Таким образом, в случае использования привилегий можно использовать:

"SHOW DATABASES LIKE 'DBname'"

как уже упоминалось ранее.


1

Вот мой способ сделать это внутри скрипта 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

Следующее решение работало для меня:

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

0

Другое решение PHP, но с PDO:

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

0

Решение Голанга

создайте тестовый пакет и добавьте:

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

Будьте внимательны при проверке существования с помощью оператора like!

Если в серии неудачных событий ваша переменная окажется пустой, и вы в итоге выполните это:

SHOW DATABASES like '' -- dangerous!

Он вернет ВСЕ базы данных, таким образом сообщая вызывающему скрипту, что он существует, так как были возвращены некоторые строки.

Гораздо безопаснее и лучше использовать знак равенства "=" для проверки существования.

Правильный и безопасный способ проверки на существование должен быть:

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

Обратите внимание, что вы должны обернуть базу данных имен столбцов обратными метками, в этом случае она не может использовать смягченный синтаксис.

Таким образом, если код, создающий переменную 'xxxxx', вернется пустым, то SHOW DATABASES не вернет ВСЕ базы данных, но вернет пустой набор.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.