是否可以在建立连接后检查MySQL数据库是否存在。

我知道如何检查一个表是否存在于一个DB,但我需要检查DB是否存在。如果不是,我必须调用另一段代码来创建它并填充它。

我知道这一切听起来有点不优雅-这是一个快速和肮脏的应用程序。


当前回答

另一个php解决方案,但与PDO:

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

其他回答

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,可以从类似的线程中看到这个答案。

我只是使用以下查询:

"USE 'DBname'"

然后检查结果是否为FALSE。 否则,可能会出现拒绝访问错误,但我不能知道这一点。 因此,在涉及特权的情况下,可以使用:

"SHOW DATABASES LIKE 'DBname'"

如前所述。

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不存在

在使用like语句检查是否存在时要小心!

如果在一系列不幸的事件中,你的变量最终为空,你最终执行这个:

SHOW DATABASES like '' -- dangerous!

它将返回ALL数据库,从而告诉调用脚本它存在,因为返回了一些行。

使用“=”等号来测试是否存在是更安全、更好的做法。

正确和安全的测试方法应该是:

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

注意,您必须用反引号来包装列名数据库,在这种情况下不能使用宽松的语法。

这样,如果创建变量“xxxxx”的代码返回空,那么SHOW DATABASES将不会返回ALL数据库,而是返回一个空集。

冗长而令人费解(但请容忍我!),这里是一个类系统,我做的检查是否DB存在,并创建所需的表:

<?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工具,不要担心这些区域,它们是用于代码折叠的