Как проверить, существует ли база данных mysql - PullRequest
258 голосов
/ 08 мая 2009

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

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

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

Ответы [ 17 ]

4 голосов
/ 23 марта 2013
SELECT IF('database_name' IN(SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA), 1, 0) AS found;
2 голосов
/ 02 октября 2015

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

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

1 голос
/ 03 июля 2018

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

SELECT 
    IF(EXISTS( SELECT 
                SCHEMA_NAME
            FROM
                INFORMATION_SCHEMA.SCHEMATA
            WHERE
                SCHEMA_NAME = 'DbName'),
        'Yes',
        'No')  as exist
1 голос
/ 07 июня 2017

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

"USE 'DBname'"

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

"SHOW DATABASES LIKE 'DBname'"

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

1 голос
/ 16 февраля 2012

код рельсов:

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 голос
/ 27 февраля 2013
IF EXISTS (SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = N'YourDatabaseName')
BEGIN    
    -- Database exists, so do your stuff here.
END

Если вы используете MSSQL вместо MySQL, посмотрите этот ответ из аналогичной темы .

0 голосов
/ 15 сентября 2015

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

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