如何检查mysql数据库是否存在

350

在建立数据库连接后,有没有可能检查数据库(MySQL)是否存在。

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

我知道这听起来有点不太优雅 - 这只是一个快速而简单的应用程序。


1
我是一名初学者程序员。您能否详细说明为什么这样做会不优雅? - sequence
2
@sequence 如果你还没有得到答案,通常情况下,你不希望你的应用程序代码来管理数据库的定义。你的应用程序应该仅限于创建/读取/更新/删除(CRUD)操作。你应该有其他流程来管理数据库结构,并将其纳入你的集成/部署过程中。 - Jason
2
@sequence 如果你还没有得到答案,通常情况下,你不希望你的应用程序代码来管理数据库的定义。你的应用程序应该仅限于创建/读取/更新/删除(CRUD)操作。你应该有其他的流程来管理数据库的结构,将其纳入你的集成/部署流程中。 - undefined
25个回答

6
CREATE SCHEMA IF NOT EXISTS `demodb` DEFAULT CHARACTER SET utf8 ;

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

6

以下是我用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

4
使用此脚本,您可以获取“是”或“否”的数据库存在状态,在不存在的情况下不会引发异常。
SELECT 
    IF(EXISTS( SELECT 
                SCHEMA_NAME
            FROM
                INFORMATION_SCHEMA.SCHEMATA
            WHERE
                SCHEMA_NAME = 'DbName'),
        'Yes',
        'No')  as exist

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替换为任何您喜欢的数据库名称,并且还可以更改创建者脚本到任何内容,(希望!)它不会破坏它。如果有人能够改进此内容,请告诉我!

注意
如果您不使用带有PHP工具的Visual Studio,则不必担心区域,它们用于代码折叠:P


2
SELECT COUNT(*) FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'DbName'

1 - 存在,0 - 不存在


1
我只是简单地使用以下查询:
"USE 'DBname'"

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

"SHOW DATABASES LIKE 'DBname'"

如前所述。


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
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,请查看这个类似主题的答案


这是针对 MSSQL 而不是 MySQL 的。 - Erin Drummond

1

另一种基于PDO的php解决方案:

<?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...');
}

你的示例假定PDO已配置为抛出异常。添加适当的配置以确保正在抛出异常。以下是如何执行此操作的示例: $db = new PDO ( $dns, $usr, $pwd, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ] ); - Herbert Peters
谢谢@HerbertPeters,我已经将其添加到我的答案中。 - Stiegi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接