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

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

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

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

459083 次浏览

如果你正在寻找一个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());
}
SELECT SCHEMA_NAME
FROM INFORMATION_SCHEMA.SCHEMATA
WHERE SCHEMA_NAME = 'DBName'

如果你只是需要知道一个db是否存在,这样你在尝试创建它时就不会得到错误,只需使用(From 在这里):

CREATE DATABASE IF NOT EXISTS DBName;

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

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

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

SHOW DATABASES LIKE 'dbname';

如果名称为'dbname'的数据库不存在,则得到一个空集。如果它存在,就得到一行。

下面是一个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
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,请参阅答案来自一个类似的帖子

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

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

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


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

这是我常用的方法。

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

下面的解决方案对我来说很有效:

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

冗长而令人费解(但请容忍我!),这里是一个类系统,我做的检查是否DB存在,并创建所需的表:

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

< p > 请注意 < br > 如果你不使用Visual Studio和PHP工具,不要担心这些区域,它们是用于代码折叠的:P

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

对于那些使用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();

一个非常简单的bash一行代码:

mysqlshow | grep dbname

我只是使用以下查询:

"USE 'DBname'"

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

"SHOW DATABASES LIKE 'DBname'"

如前所述。

有了这个脚本,你可以得到是否数据库存在,如果它不存在,它不会抛出异常。

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

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

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

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


}

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

如果在一系列不幸的事件中,你的变量最终为空,你最终执行这个:

SHOW DATABASES like '' -- dangerous!

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

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

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

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

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

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

当你没有足够的权限查看数据库时,使用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
SELECT COUNT(*) FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'DbName'

1 -存在,0 -不存在