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

Posted

技术标签:

【中文标题】如何检查mysql数据库是不是存在【英文标题】:How to check if mysql database exists如何检查mysql数据库是否存在 【发布时间】:2009-05-08 09:22:14 【问题描述】:

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

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

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

【问题讨论】:

我是新手程序员。您能否详细说明为什么这会不优雅? 【参考方案1】:
SELECT SCHEMA_NAME
  FROM INFORMATION_SCHEMA.SCHEMATA
 WHERE SCHEMA_NAME = 'DBName'

如果您只需要知道数据库是否存在,以便在尝试创建它时不会出错,只需使用 (From here):

CREATE DATABASE IF NOT EXISTS DBName;

【讨论】:

第一个好。第二个没那么多。您可能没有数据库创建权限。 @OllieJones 第二个也不错,回答者假设 OP 是否要创建数据库 为什么“INFORMATION_SCHEMA”全部大写?对我来说,它都是小写的 * 好的,显然 phpMyAdmin 只是以小写形式显示所有数据库名称,并且您的查询无论如何都可以使用 同意@nawfal;我可能不想创建数据库,只知道它是否存在。【参考方案2】:

检查数据库是否存在的简单方法是:

SHOW DATABASES LIKE 'dbname';

如果名称为“dbname”的数据库不存在,您将得到一个空集。如果它确实存在,你会得到一行。

【讨论】:

工作得更好然后解决方案标记为正确。谢谢] 有关解释这个好答案的官方信息,请转到官方网站的有关命令的文档页面: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 参考手册/ 教程 / 创建和使用数据库”)。 这可能比直接查询 INFORMATION_SCHEMA 慢,但它的可读性和易于理解性要高得多,这对我来说是更重要的考虑因素。 这是一个更好的解决方案,因为如果您测试数据库是否存在,您可能想要创建它。 “如果不存在则创建数据库”很烦人,因为如果数据库确实存在,任何以下定义表的代码都会被炸毁。我看不出这个命令有什么用。 @Keir 虽然这看起来很烦人,但想象一下两个线程试图同时创建同一个数据库,如果一个线程失败会发生什么。虽然它对于在尝试创建数据库之前确定数据库是否存在没有用处,但对于防止多个线程可能正在尝试创建它时发生冲突很有用。【参考方案3】:

从 shell 像 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

【讨论】:

这实际上不起作用...而是尝试类似:` result=$(mysql -s -N -e "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME='db'");如果 [ -z "$result" ];然后回显“数据库不存在”;菲 @StevenGreen 对此的改编工作正常,因此为 bash/sql sn-p +1。 不要忘记在命令行或通过 .my.cnf 包含您的用户详细信息。 对于那些对 Steven Green 评论中使用的标签感到好奇的人,-s 是静音模式,输出较少,-N 将在返回结果时跳过列名,-e 是标签执行提供的查询。【参考方案4】:

如果您正在寻找 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());

【讨论】:

【参考方案5】:

一个非常简单的 BASH-one-liner:

mysqlshow | grep dbname

【讨论】:

【参考方案6】:

这是一个检查数据库是否存在的 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 作为替代方案,但&gt;/dev/null 保证结果始终为空。试试if [ -z "$(mysql $db 2&gt;&amp;1 &lt;/dev/null)" ]; then ... 之类的东西。 @Bobble &gt;/dev/null 不会更改运行 mysql 的退出代码。如果有错误,它只是隐藏输出。 if ...; then 部分检查退出代码。【参考方案7】:

对于那些将 php 与 mysqli 一起使用的人,这是我的解决方案。我知道答案已经得到解答,但我认为将答案作为 mysqli 准备好的语句也会有所帮助。

$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();

【讨论】:

【参考方案8】:

在 PHP 中检查数据库是否存在的好方法是:

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

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

这是我一直使用的方法。

【讨论】:

mysql_函数不推荐使用了! @Marien 谁说不推荐?我的老师还在教我们mysql。 @MJDelosSantos 因为它们已被 mysqli 函数和/或 PDO 类替换 @Marien 啊,我明白了。【参考方案9】:

使用 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

【讨论】:

【参考方案10】:
CREATE SCHEMA IF NOT EXISTS `demodb` DEFAULT CHARACTER SET utf8 ;

【讨论】:

【参考方案11】:
SELECT IF('database_name' IN(SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA), 1, 0) AS found;

【讨论】:

【参考方案12】:

使用此脚本,您可以获得是或否数据库存在,如果它不存在,它不会抛出异常。

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

【讨论】:

【参考方案13】:

这是我在 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

【讨论】:

【参考方案14】:

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

如果在一系列不幸事件中您的变量最终为空,而您最终执行以下操作:

SHOW DATABASES like '' -- dangerous!

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

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

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

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

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

这样,如果创建变量 'xxxxx' 的代码返回空白,则 SHOW DATABASES 不会返回所有数据库,而是返回一个空集。

【讨论】:

【参考方案15】:

冗长而复杂(但请耐心等待!),这是我创建的一个类系统,用于检查数据库是否存在并创建所需的表:

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

【讨论】:

【参考方案16】:

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

【讨论】:

【参考方案17】:
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,请参阅answer from a similar thread。

【讨论】:

这是用于 MSSQL,而不是 MySQL【参考方案18】:

我只使用以下查询:

"USE 'DBname'"

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

"SHOW DATABASES LIKE 'DBname'"

如前所述。

【讨论】:

【参考方案19】:

另一种 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...');

【讨论】:

您的示例假定 PDO 配置为引发异常 添加适当的配置以确保引发异常。这是一个如何执行此操作的示例:$db = new PDO ( $dns, $usr, $pwd, [ PDO::ATTR_ERRMODE =&gt; PDO::ERRMODE_EXCEPTION ] ); 感谢@HerbertPeters,我将其添加到我的答案中【参考方案20】:

以下解决方案对我有用:

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

【讨论】:

【参考方案21】:

Golang 解决方案

创建一个测试包并添加:

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")
    

 

【讨论】:

【参考方案22】:

当您没有足够的权限查看数据库时,使用INFORMATION_SCHEMAshow databases 是不可靠的。当您无权访问它时,似乎该数据库不存在。然后创建将失败。进行更精确检查的另一种方法是使用 use 命令的输出,即使我不知道这种方法有多可靠(未来版本/其他语言中的文本输出更改......)所以请注意。

CHECK=$(mysql -sNe "use DB_NAME" 2>&1)
if [ $? -eq 0 ]; then
  # database exists and is accessible
elif [ ! -z "$(echo $CHECK | grep 'Unknown database')" ]; then
  # database does not exist
elif [ ! -z "$(echo $CHECK | grep 'Access denied')" ]; then
  # cannot tell if database exists (not enough permissions)"
else
  # unexpected output
fi

【讨论】:

【参考方案23】:
SELECT COUNT(*) FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'DbName'

1 - 存在,0 - 不存在

【讨论】:

以上是关于如何检查mysql数据库是不是存在的主要内容,如果未能解决你的问题,请参考以下文章

如何检查MySQL中是不是存在行? (即检查电子邮件是不是存在于 MySQL 中)

如何检查php中是不是已经存在mysql数据库? [复制]

如何使用 shell 脚本检查 MySQL 数据库中是不是存在表?

JDBC / MySQL:如何在创建数据库或关系时检查数据库或关系是不是存在,如果存在则打印错误

如何在插入 MySQL 之前检查表中是不是存在名称 [重复]

检查mysql中是不是存在视图