336

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

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

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

4

23 回答 23

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

如果您只需要知道数据库是否存在,以便在尝试创建它时不会出错,只需使用(从这里):

CREATE DATABASE IF NOT EXISTS DBName;
于 2009-05-08T09:26:54.653 回答
145

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

SHOW DATABASES LIKE 'dbname';

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

于 2012-06-17T10:15:51.430 回答
23

从 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
于 2012-03-27T21:43:35.323 回答
21

如果您正在寻找 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());
}
于 2009-05-08T09:26:27.133 回答
13

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

mysqlshow | grep dbname
于 2017-04-10T12:04:07.333 回答
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
于 2012-09-14T15:48:48.483 回答
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";
}

这是我一直使用的方法。

于 2014-12-12T10:47:01.440 回答
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();
于 2016-07-20T12:57:42.427 回答
7

使用 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
于 2015-11-11T11:49:09.253 回答
6
CREATE SCHEMA IF NOT EXISTS `demodb` DEFAULT CHARACTER SET utf8 ;
于 2015-01-03T23:16:22.083 回答
5
SELECT IF('database_name' IN(SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA), 1, 0) AS found;
于 2013-03-23T03:45:16.087 回答
4

使用此脚本,您可以获得是或否数据库存在,如果它不存在,它不会抛出异常。

SELECT 
    IF(EXISTS( SELECT 
                SCHEMA_NAME
            FROM
                INFORMATION_SCHEMA.SCHEMATA
            WHERE
                SCHEMA_NAME = 'DbName'),
        'Yes',
        'No')  as exist
于 2018-07-03T00:59:50.370 回答
3

这是我在 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
于 2020-01-12T22:32:42.993 回答
3

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

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

SHOW DATABASES like '' -- dangerous!

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

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

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

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

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

这样,如果创建变量 'xxxxx' 的代码返回空白,则 SHOW DATABASES 不会返回所有数据库,而是返回一个空集。

于 2020-04-17T13:57:03.397 回答
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

于 2015-10-02T15:57:32.080 回答
1

导轨代码:

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

于 2012-02-16T08:04:22.067 回答
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,请参阅类似线程的此答案

于 2013-02-26T23:09:38.343 回答
1

我只使用以下查询:

"USE 'DBname'"

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

"SHOW DATABASES LIKE 'DBname'"

如前所述。

于 2017-06-07T18:59:05.750 回答
1

另一个 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...');
}
于 2020-03-04T11:36:40.497 回答
0

以下解决方案对我有用:

mysql -u${MYSQL_USER} -p${MYSQL_PASSWORD} \
-s -N -e "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME='${MYSQL_DATABASE}'"
于 2015-09-15T05:06:53.027 回答
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")
    }

} 
于 2020-03-10T10:19:00.010 回答
0

当您没有足够的权限查看数据库时,使用INFORMATION_SCHEMAor是不可靠的。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
于 2021-01-06T15:26:34.093 回答
0
SELECT COUNT(*) FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'DbName'

1 - 存在,0 - 不存在

于 2021-10-28T11:03:14.513 回答