2009-05-08 60 views
205

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

DBにテーブルが存在するかどうかを確認する方法は分かっていますが、DBが存在するかどうかを確認する必要があります。そうでなければ、別のコードを呼び出してそれを作成しなければなりません。

私はこのすべてが幾分優雅ではないことを知っています - これはすばやく汚いアプリです。

答えて

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

あなただけのDBは、あなたがそれを作成しようとするので、あなたは(hereから)簡単に使用し、エラーを取得することはありませんが存在するかどうかを知る必要がある場合:

CREATE DATABASE IF NOT EXISTS DBName; 
+8

最初は良いです。 2番目のものはそうではありません。データベース作成権限がない可能性があります。 –

+14

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

+2

なぜ「INFORMATION_SCHEMA」がすべて大文字ですか?私の場合は小文字である – Hubro

20

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

存在しません10
15

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" SCHEMA_NAME = 'db' "のINFORMATION_SCHEMA.SCHEMATAからSELECT SCHEMA_NAMEを選択してください。 [-z "$ result"]; then エコー "db does not exist"; fi –

+1

@ StevenGreenのこれの改良はうまく動作するので、bash/sqlスニペットに+1してください。 – Bobble

+0

あなたのユーザの詳細を、コマンドラインまたは.my.cnfを介して忘れてはいけません。 –

78

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

SHOW DATABASES LIKE 'dbname'; 

名「DBNAME」を持つデータベースが存在しない場合は、あなたが空を取得セット。存在する場合は、1つの行が取得されます。ここで

+1

解決策が正しく機能していることを確認してください。ありがとう] –

+1

この方法は、受け入れられた答えよりも遅いです – CIRCLE

+0

この良い答えを説明している正式な情報については、コマンドに関する公式サイトのドキュメントページhttp://dev.mysql.com/doc/refman/5.5/ja/を参照してください。 show-databases.html(有用なチュートリアルのページは私にそれをもたらしました。http://dev.mysql.com/doc/refman/5.5/en/database-use.html( "MySQL 5.5リファレンスマニュアル/チュートリアル/作成と使用データベース ")。 – Edward

8

は、データベースが存在するかどうかをチェックするための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 
+0

+1の代わりに '>/dev/null'が結果が常にnullであることを保証します。 'if [-z" $(mysql $ {db} 2>&1 Bobble

+0

@Bobble '>/dev/null'は、終了コードが' mysql'から変更されることはありません。エラーがあれば出力を隠すだけです。 'もし...あれ。 thenパートは終了コードをチェックします。 –

+0

うそつき私の悪い:) – Bobble

2
IF EXISTS (SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = N'YourDatabaseName') 
BEGIN  
    -- Database exists, so do your stuff here. 
END 

あなたが代わりのMySQLのMSSQLを使用している場合は、このanswer from a similar threadを参照してください。

+0

これはMySQLのではなく、MSSQLのです –

4
SELECT IF('database_name' IN(SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA), 1, 0) AS found; 
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 :)"; 
+1

言語はPHPです – ceed

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

次の解決策は私のために働いた:

mysql -u${MYSQL_USER} -p${MYSQL_PASSWORD} \ 
-s -N -e "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME='${MYSQL_DATABASE}'" 
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を交換しても、作成者を変更することができます何かにスクリプトを(そしてうまくいけば!)それはそれを壊すことはありません。誰かがこれを改善できる場合は、私に教えてください!


あなたが地域を心配していない、PHPのツールを使用してVisual Studioを使用していない場合、彼らは、コードの折りたたみのためのものである:P

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 
3

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

非常に簡単なBASH-ワンライナー:

mysqlshow | grep dbname 
0

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

"USE 'DBname'" 

結果がFALSEであれば、確認してください。 それ以外の場合、アクセス拒否エラーが発生する可能性がありますが、そのことはわかりません。 ので、関係する権限の場合には、一つは使用することができます。

"SHOW DATABASES LIKE 'DBname'" 

すでに前述したように。

関連する問題