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


292

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

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

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

Answers:


463
SELECT SCHEMA_NAME
  FROM INFORMATION_SCHEMA.SCHEMATA
 WHERE SCHEMA_NAME = 'DBName'

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

CREATE DATABASE IF NOT EXISTS DBName;

9
第一个好。第二个没有那么多。您可能没有数据库创建特权。
O. Jones

21
@OllieJones第二个也很好,答案是假设OP是否要创建数据库
nawfal 2012年

3
为什么大写字母都用“ INFORMATION_SCHEMA”?和我在一起的都是小写
Hubro 2012年

3
*确定,显然,PHPMyAdmin仅以小写形式显示所有数据库名称,并且无论如何,您的查询都可以使用
Hubro 2012年

1
同意@nawfal; 我可能不想创建数据库,只知道它是否存在。
SteveCinq '17

122

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

SHOW DATABASES LIKE 'dbname';

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


1
工作得更好,然后解决方案标记为正确。感谢]
约翰·威廉姆斯2015年

有关解释此良好答案的官方信息,请访问官方网站的以下命令文档页面: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参考手册/教程/创建和使用数据库”)。–
Edward

2
这可能比直接查询INFORMATION_SCHEMA慢,但是它更具可读性和易于理解性,在我的案例中这是更重要的考虑因素。
丹尼尔·霍华德

这是一个更好的解决方案,因为如果您测试是否存在数据库,则可能要创建它。“如果不存在则创建数据库”很烦人,因为如果数据库确实存在,则定义表的任何以下代码都会被炸毁。我看不到该命令的用处。
基尔

@Keir尽管看起来很烦人,但想象一下两个线程试图同时创建相同的数据库,如果一个线程失败会发生什么。虽然在尝试创建数据库之前确定数据库是否存在没有用,但在多个线程尝试创建数据库时防止冲突是有用的。
Brogan

22

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

22

从外壳像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

3
这实际上不起作用...而是尝试如下操作:`result = $(mysql -s -N -e“从INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME ='db'”选择SCHEMA_NAME);如果[-z“ $ result”]; 然后回显“ db不存在”;fi
史蒂文·格林

1
@StevenGreen对此的适应效果很好,因此bash / sql片段为+1。
泡泡2014年

不要忘记在命令行或通过.my.cnf包含用户详细信息。
Goobri先生17年

11

这是一个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作为替代,但>/dev/null保证结果始终为空。尝试类似的东西if [ -z "$(mysql ${db} 2>&1 </dev/null)" ]; then ...
泡泡2014年

@Bobble >/dev/null不会更改退出代码的运行状态mysql。如果有错误,它将仅隐藏输出。该if ...; then部分检查退出代码。
docwhat 2015年

9

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

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

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

那就是我一直使用的方法。


7

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

mysqlshow | grep dbname

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

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

4

对于那些将mysqli与php一起使用的人,这是我的解决方案。我知道答案已经被回答了,但是我认为将答案作为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();

4

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

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

注意
如果您不将Visual Studio与PHP工具一起使用,请不要担心这些区域,它们是用于代码折叠的区域:P


2

使用此脚本,您可以获取“是”或“不存在”数据库,如果不存在则不会引发异常。

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

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的不
艾琳德拉蒙德

1

我只使用以下查询:

"USE 'DBname'"

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

"SHOW DATABASES LIKE 'DBname'"

如前所述。


1

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


0

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

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

0

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

} 

0

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

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

SHOW DATABASES like '' -- dangerous!

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

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

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

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.