接続後に (MySQL) データベースが存在するかどうかを確認することは可能ですか。
DB にテーブルが存在するかどうかを確認する方法は知っていますが、DB が存在するかどうかを確認する必要があります。そうでない場合は、別のコードを呼び出して作成し、入力する必要があります。
私はこれがやや洗練されていないように聞こえることを知っています - これは速くて汚いアプリです.
SELECT SCHEMA_NAME
FROM INFORMATION_SCHEMA.SCHEMATA
WHERE SCHEMA_NAME = 'DBName'
データベースを作成しようとしたときにエラーが発生しないように、データベースが存在するかどうかを知りたいだけの場合は、次のようにします (ここから):
CREATE DATABASE IF NOT EXISTS DBName;
データベースが存在するかどうかを確認する簡単な方法は次のとおりです。
SHOW DATABASES LIKE 'dbname';
「dbname」という名前のデータベースが存在しない場合は、空のセットが取得されます。存在する場合は、1 行を取得します。
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
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());
}
データベースが存在するかどうかを確認するための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
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();
SELECT IF('database_name' IN(SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA), 1, 0) AS found;
このスクリプトを使用すると、データベースが存在するかどうかを取得できます。データベースが存在しない場合、例外はスローされません。
SELECT
IF(EXISTS( SELECT
SCHEMA_NAME
FROM
INFORMATION_SCHEMA.SCHEMATA
WHERE
SCHEMA_NAME = 'DbName'),
'Yes',
'No') as exist
likeステートメントで存在をチェックするときは注意してください!
一連の不幸な出来事で変数が空になってしまい、これを実行することになった場合:
SHOW DATABASES like '' -- dangerous!
すべてのデータベースが返されるため、一部の行が返されたため、呼び出し元のスクリプトにデータベースが存在することが通知されます。
「=」等号を使用して存在をテストする方が、はるかに安全で優れた方法です。
存在をテストするための正しく安全な方法は次のとおりです。
SHOW DATABASES WHERE `database` = 'xxxxx' -- safe way to test for existence
列名データベースをバックティックでラップする必要があることに注意してください。この場合、緩和された構文は使用できません。
このように、変数 'xxxxx' を作成するコードが空白を返した場合、SHOW DATABASES はすべてのデータベースを返すのではなく、空のセットを返します。
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 を使用している場合は、同様のスレッドからのこの回答を参照してください。
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 なし