如何检查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 作为替代方案,但>/dev/null
保证结果始终为空。试试if [ -z "$(mysql $db 2>&1 </dev/null)" ]; then ...
之类的东西。
@Bobble >/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 => 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_SCHEMA
或show 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 中)
如何使用 shell 脚本检查 MySQL 数据库中是不是存在表?
JDBC / MySQL:如何在创建数据库或关系时检查数据库或关系是不是存在,如果存在则打印错误