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

350

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

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

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


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

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

如果你只需要知道数据库是否存在,以便在尝试创建它时不会出现错误,请简单地使用以下代码(来自于 这里):

CREATE DATABASE IF NOT EXISTS DBName;

9
第一个不错。第二个就不怎么好了。可能您没有创建数据库的权限。 - O. Jones
27
@OllieJones的第二个回答也很好,回答者假设如果OP想要创建一个数据库。 - nawfal
3
为什么“INFORMATION_SCHEMA”要全部大写?但我看到它都是小写的。 - Hubro
3
好的,显然PHPMyAdmin只以小写形式显示所有数据库名称,而您的查询语句在任何情况下都可以使用。 - Hubro
1
同意 @nawfal;我可能不想创建数据库,只是想知道它是否存在。 - SteveCinq
显示剩余4条评论

157

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

SHOW DATABASES LIKE 'dbname';
如果名为“dbname”的数据库不存在,则会得到一个空集。如果它存在,您将得到一行数据。

1
工作得比标记为正确的解决方案更好。谢谢。 - John williams
如需官方信息来解释这个好答案,请访问官方网站有关命令的文档页面:http://dev.mysql.com/doc/refman/5.5/en/show-databases.html(一个有用的教程页面引导我找到了它,http://dev.mysql.com/doc/refman/5.5/en/database-use.html(“MySQL 5.5 参考手册/Tutorial/创建和使用数据库”)。 - Edward
3
这种方法可能比直接查询 INFORMATION_SCHEMA 要慢,但更易读且更易理解,这在我的情况下更为重要。 - Daniel Howard
这是一个更好的解决方案,因为如果您测试数据库的存在性,那么您可能想要创建它。"如果不存在则创建数据库"很烦人,因为如果数据库已经存在,则定义表的任何后续代码都将失败。我看不出这个命令有什么用处。 - Keir
@Keir 虽然这可能看起来很烦人,但想象一下两个线程同时尝试创建同一个数据库,如果其中一个失败会发生什么。虽然它不能确定在尝试创建数据库之前是否存在,但它对于防止多个线程同时尝试创建它时的冲突非常有用。 - Brogan
不要使用 like 来测试存在性,因为如果变量为空,它可能会导致返回所有数据库,请查看我的下面的回复:https://dev59.com/THRA5IYBdhLWcg3wwwzD#61273393 - Wadih M.

24

来自像bash这样的shell

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

8
这实际上不起作用...尝试类似这样的内容:result=$(mysql -s -N -e "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME='db'"); if [ -z "$result" ]; then echo "数据库不存在"; fi - Steven Green
1
@StevenGreen的改编很好,所以对于这个bash/sql片段给予+1的支持。 - Bobble
1
不要忘记在命令行或通过.my.cnf文件中包含您的用户详细信息。 - Mr Goobri
1
对于那些对Steven Green评论中使用的标签感到好奇的人,-s是静默模式,可以减少输出量,-N将在返回结果时跳过列名,-e是执行提供的查询的标签。 - Leland Hepworth

20

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

17
一个非常简单的BASH一行命令:
mysqlshow | grep dbname

2
这也将匹配名为 prefix_dbname_suffix 等的数据库,因为 grep 匹配包含该字符串的行,而不是完全等于该字符串的行。 - Flimm

12

这是一个用于检查数据库是否存在的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 ... - Bobble
@Bobble >/dev/null 并不会改变运行 mysql 的退出代码,它只是在出现错误时隐藏输出。if ...; then 部分检查退出代码。 - docwhat

8

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

8

如果您使用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
@Marien 说不推荐使用 MySQL?我的老师还在教我们 MySQL 呢。 - MJ DLS
@MJDelosSantos 因为它们被mysqli函数和/或PDO类所取代。 - Marien
@Marien 哦,我明白了。 - MJ DLS

7

使用like语句检查存在时一定要小心!

如果不幸的是,你的变量最终为空,并且你执行了以下操作:

SHOW DATABASES like '' -- dangerous!

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

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

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

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

请注意,您必须使用反引号将数据库列名称括起来,在这种情况下它不能使用放松的语法。
这样,如果创建变量“xxxxx”的代码返回空白,则SHOW DATABASES不会返回所有数据库,而是返回一个空集。

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