在建立连接后是否可以检查(MySQL)数据库是否存在。
我知道如何检查数据库中是否存在表,但我需要检查数据库是否存在。如果不是,我必须调用另一段代码来创建它并填充它。
我知道这听起来有些不雅 - 这是一个快速而又脏的应用程序。
答案 0 :(得分:407)
SELECT SCHEMA_NAME
FROM INFORMATION_SCHEMA.SCHEMATA
WHERE SCHEMA_NAME = 'DBName'
如果您只需要知道数据库是否存在,那么当您尝试创建数据库时不会出现错误,只需使用(来自here):
CREATE DATABASE IF NOT EXISTS DBName;
答案 1 :(得分:104)
检查数据库是否存在的简单方法是:
SHOW DATABASES LIKE 'dbname';
如果名称为“dbname”的数据库不存在,则会得到一个空集。如果确实存在,则会得到一行。
答案 2 :(得分: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());
}
答案 3 :(得分:19)
来自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
答案 4 :(得分:10)
这是一个用于检查数据库是否存在的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
答案 5 :(得分:9)
检查dabtabse是否存在的另一种最佳方法是:
$mysql = mysql_connect("<your host>", "root", "");
if(mysql_select_db('<your db name>', $mysql)){
echo "databse exists";
}else{
echo "Databse does not exists";
}
这是我一直用来检查数据库是否存在的方法....
echo "rate if you enjoy :)";
答案 6 :(得分:6)
一个非常简单的BASH-one-liner:
mysqlshow | grep dbname
答案 7 :(得分:5)
CREATE SCHEMA IF NOT EXISTS `demodb` DEFAULT CHARACTER SET utf8 ;
答案 8 :(得分:4)
SELECT IF('database_name' IN(SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA), 1, 0) AS found;
答案 9 :(得分:4)
对于那些使用php和mysqli的人来说,这是我的解决方案。我知道答案已经得到了解答,但我认为将答案作为mysqli准备好的陈述也是有帮助的。
SomeOtherThatExecuteServices
答案 10 :(得分: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
答案 11 :(得分: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
,并将创建者脚本更改为任何内容,并且(希望!)它不会破坏它。如果有人能改进这一点,请告诉我!
注意强>
如果你不使用带有PHP工具的Visual Studio,不要担心这些区域,它们是用于代码折叠的:P
答案 12 :(得分:2)
这是我在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
答案 13 :(得分: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,请参阅此answer from a similar thread。
答案 14 :(得分:1)
我只使用以下查询:
"USE 'DBname'"
然后检查结果是否为FALSE。 否则,可能存在拒绝访问错误,但我无法知道。 因此,如果涉及特权,可以使用:
"SHOW DATABASES LIKE 'DBname'"
如前所述。
答案 15 :(得分:1)
使用此脚本,您可以获取是或否数据库,如果不存在则不会引发异常。
SELECT
IF(EXISTS( SELECT
SCHEMA_NAME
FROM
INFORMATION_SCHEMA.SCHEMATA
WHERE
SCHEMA_NAME = 'DbName'),
'Yes',
'No') as exist
答案 16 :(得分: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'
=> []
=&GT; entos_development存在,entos_development1不存在
答案 17 :(得分:1)
使用like语句检查是否存在!
如果在一系列不幸的事件中,您的变量最终为空,那么您最终将执行以下操作:
SHOW DATABASES like '' -- dangerous!
它将返回 ALL 个数据库,从而告诉调用脚本它存在,因为返回了一些行。
使用“ =” 等号测试存在性是更安全和更好的做法。
测试存在性的正确和安全方法应该是:
SHOW DATABASES WHERE `database` = 'xxxxx' -- safe way to test for existence
请注意,您必须用反引号将列名数据库包装起来,在这种情况下,它不能使用宽松的语法。
这样,如果创建变量“ xxxxx”的代码返回空白,那么SHOW DATABASES将不会返回所有数据库,但会返回一个空集。
答案 18 :(得分:0)
以下解决方案为我工作:
mysql -u${MYSQL_USER} -p${MYSQL_PASSWORD} \
-s -N -e "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME='${MYSQL_DATABASE}'"
答案 19 :(得分: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...');
}
答案 20 :(得分: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")
}
}
答案 21 :(得分:0)
当您没有足够的权限查看数据库时,使用 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
答案 22 :(得分:-1)
您可以使用以下函数来检查 MySQL 模式中是否存在数据库。
function database_exists($host, $dbname, $username, $password)
{
// $dbname ='database_name';
// $host ='localhost';
$dbExists = false;
$conn = mysqli_connect($host, $username, $password);
$query = "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME='$dbname';";
if(!is_null($conn)){
$stmt = $conn->prepare($query);
$stmt->execute();
$i = 0;
write_log2('12619B55BD8A','State: ');
if (!is_null($stmt)){
if ( $stmt->fetch()) {
$i++;
$dbExists=true;
//database exists
}else{
$dbExists=false;
//database does not exist
}
}
}
$stmt->close();
$stmt=null;
return $dbExists;
}//[end function]