【问题标题】:How to check if mysql database exists如何检查mysql数据库是否存在
【发布时间】:2010-10-24 17:59:56
【问题描述】:

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

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

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

【问题讨论】:

    标签: mysql database exists


    【解决方案1】:
    SELECT SCHEMA_NAME
      FROM INFORMATION_SCHEMA.SCHEMATA
     WHERE SCHEMA_NAME = 'DBName'
    

    如果您只需要知道一个 db 是否存在,以便在尝试创建它时不会出错,只需使用 (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 函数:

      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 部分检查退出代码。
      【解决方案6】:

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

      mysqlshow | grep dbname
      

      【讨论】:

        【解决方案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】:

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

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

                    【讨论】:

                      【解决方案15】:

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

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

                      SHOW DATABASES like '' -- dangerous!
                      

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

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

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

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

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

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

                      【讨论】:

                        【解决方案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 - 不存在

                                  【讨论】:

                                    猜你喜欢
                                    • 2014-09-04
                                    • 1970-01-01
                                    • 2012-07-02
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 2022-11-26
                                    • 2013-12-31
                                    相关资源
                                    最近更新 更多