回答:
SELECT SCHEMA_NAME
FROM INFORMATION_SCHEMA.SCHEMATA
WHERE SCHEMA_NAME = 'DBName'
dbが存在するかどうかを知る必要があるだけで、作成しようとしたときにエラーが発生しない場合は、(ここから)を使用します。
CREATE DATABASE IF NOT EXISTS DBName;
データベースが存在するかどうかを確認する簡単な方法は次のとおりです。
SHOW DATABASES LIKE 'dbname';
「dbname」という名前のデータベースが存在しない場合は、空のセットが取得されます。存在する場合は、1つの行を取得します。
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のようなシェルから
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
次に、データベースが存在するかどうかを確認するための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
>/dev/null
、結果が常にnullであることを保証します。のようなものを試してくださいif [ -z "$(mysql ${db} 2>&1 </dev/null)" ]; then ...
。
>/dev/null
は終了コードの実行を変更しませんmysql
。エラーが発生した場合は、出力を非表示にするだけです。if ...; then
部分は、終了コードをチェックします。
PHPにデータベースが存在するかどうかを確認する優れた方法は、次のとおりです。
$mysql = mysql_connect("<your host>", "root", "");
if (mysql_select_db($mysql, '<your db name>')) {
echo "Database exists";
} else {
echo "Database does not exist";
}
それが私がいつも使う方法です。
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();
長くて複雑ですが(私と一緒にください!)、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
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は存在しません
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を使用している場合は、同様のスレッドからこの回答を参照してください。
これが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
次の解決策は私のために働きました:
mysql -u${MYSQL_USER} -p${MYSQL_PASSWORD} \
-s -N -e "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME='${MYSQL_DATABASE}'"
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")
}
}
likeステートメントで存在を確認するときは注意してください。
一連の不幸なイベントで変数が空になり、最終的にこれが実行される場合:
SHOW DATABASES like '' -- dangerous!
ALLを返しますデータベース、一部の行が返されたために存在することを呼び出しスクリプトにます。
「=」を使用する方がはるかに安全で優れた方法です等号して存在をテストです。
存在をテストする正しい安全な方法は、次のとおりです。
SHOW DATABASES WHERE `database` = 'xxxxx' -- safe way to test for existence
列名データベースをバックティックでラップする必要があることに注意してください。この場合、緩和された構文は使用できません。
このように、変数「xxxxx」を作成するコードが空白を返した場合、SHOW DATABASESはすべてのデータベースを返さず、空のセットを返します。