MySQLデータベースが存在するかどうかを確認する方法


292

接続を行った後に(MySQL)データベースが存在するかどうかを確認することは可能ですか?

テーブルがDBに存在するかどうかを確認する方法は知っていますが、DBが存在するかどうかを確認する必要があります。そうでない場合は、別のコードを呼び出して作成してデータを入力する必要があります。

私はこれがすべてやや洗練されていないように聞こえることを知っています-これは素早く汚れたアプリです。

回答:


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

dbが存在するかどうかを知る必要があるだけで、作成しようとしたときにエラーが発生しない場合は、(ここから)を使用します。

CREATE DATABASE IF NOT EXISTS DBName;

9
最初に良い。2つ目はそれほどではありません。データベース作成権限がない可能性があります。
O.ジョーンズ、

21
@OllieJonesの2番目のものも良いです。OPがデータベースを作成したい場合、回答者は仮定します
nawfal

3
「INFORMATION_SCHEMA」がすべて大文字になっているのはなぜですか?私の場合はすべて小文字です
Hubro

3
* OK、どうやらPHPMyAdminはすべてのデータベース名を小文字で表示するだけで、クエリはどちらでも使用できます
Hubro

1
@nawfalに同意してください。DBを作成したくない場合は、それが存在するかどうかを確認してください。
SteveCinq 2017

122

データベースが存在するかどうかを確認する簡単な方法は次のとおりです。

SHOW DATABASES LIKE 'dbname';

「dbname」という名前のデータベースが存在しない場合は、空のセットが取得されます。存在する場合は、1つの行を取得します。


1
ソリューションが正しいとマークした後、うまく機能しました。ありがとう]
ジョン・ウィリアムズ

この良い答えを説明する公式の情報については、コマンドについての公式サイトのドキュメント・ページを参照してください: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リファレンスマニュアル/チュートリアル/データベースの作成と使用」)
Edward

2
これは、INFORMATION_SCHEMAを直接クエリするよりも遅いかもしれませんが、はるかに読みやすく、理解しやすいので、私の場合は、これがより重要な考慮事項でした。
Daniel Howard

データベースの存在をテストする場合、データベースを作成する必要があるため、これはより良いソリューションです。「データベースが存在しない場合はデータベースを作成する」は、データベースが存在する場合、テーブルを定義するための次のコードが爆弾になるため、迷惑です。コマンドがどのように役立つかわかりません。
キール2018年

@Keir煩わしく思えるかもしれませんが、2つのスレッドが同じデータベースを同時に作成しようとし、1つのスレッドが失敗した場合にどうなるかを想像してみてください。データベースを作成しようとする前にデータベースが存在するかどうかを判断するのには役立ちませんが、複数のスレッドがデータベースを作成しようとしている可能性がある場合の衝突を防ぐのに役立ちます。
Brogan

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());
}

22

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

3
これは実際には機能しません...代わりに次のように試してください。`result = $(mysql -s -N -e "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'db'"); if [-z "$ result"]; 次に、「dbは存在しません」とエコーします。fi
Steven Green

1
@StevenGreenによるこれの適応は問題なく機能するため、bash / sqlスニペットでは+1します。
Bobble 2014

コマンドラインまたは.my.cnfを使用して、ユーザーの詳細を含めることを忘れないでください。
グーブリ氏2017年

11

次に、データベースが存在するかどうかを確認するための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
}           

もう1つの方法は、データベースを使用することです。これは権限もチェックすることに注意してください:

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、結果が常にnullであることを保証します。のようなものを試してくださいif [ -z "$(mysql ${db} 2>&1 </dev/null)" ]; then ...
Bobble

@Bobble >/dev/nullは終了コードの実行を変更しませんmysql。エラーが発生した場合は、出力を非表示にするだけです。if ...; then部分は、終了コードをチェックします。
docwhat

9

PHPにデータベースが存在するかどうかを確認する優れた方法は、次のとおりです。

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

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

それが私がいつも使う方法です。



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

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

4

mysqliでphpを使用する人にとって、これは私の解決策です。私は答えがすでに答えられていることを知っていますが、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();

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

2

長くて複雑ですが(私と一緒にください!)、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を任意のデータベース名に置き換えることができ、作成者スクリプトをまったく何にでも変更できます(うまくいけば!)それはそれを壊しません。誰かがこれを改善できるなら、私に知らせてください!


Visual StudioをPHPツールと一緒に使用しない場合でも、領域について心配する必要はありません。これらは、コードを折りたたむための領域です:P


2

このスクリプトを使用すると、データベースが存在しない場合に例外をスローせずに、データベースが存在するかどうかを確認できます。

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

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'
=> []

=> entos_developmentは存在しますが、entos_development1は存在しません



1

私は単に次のクエリを使用しています:

"USE 'DBname'"

次に、結果がFALSEかどうかを確認します。そうしないと、アクセス拒否エラーが発生する可能性がありますが、それはわかりません。したがって、権限が必要な場合は、次のように使用できます。

"SHOW DATABASES LIKE 'DBname'"

前述のとおり。


1

これが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

0

次の解決策は私のために働きました:

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

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

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

} 

0

likeステートメントで存在を確認するときは注意してください。

一連の不幸なイベントで変数が空になり、最終的にこれが実行される場合:

SHOW DATABASES like '' -- dangerous!

ALLを返しますデータベース、一部の行が返されたために存在することを呼び出しスクリプトにます。

「=」を使用する方がはるかに安全で優れた方法です等号して存在をテストです。

存在をテストする正しい安全な方法は、次のとおりです。

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

列名データベースをバックティックでラップする必要があることに注意してください。この場合、緩和された構文は使用できません。

このように、変数「xxxxx」を作成するコードが空白を返した場合、SHOW DATABASESはすべてのデータベースを返さず、空のセットを返します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.