답변:
SELECT SCHEMA_NAME
FROM INFORMATION_SCHEMA.SCHEMATA
WHERE SCHEMA_NAME = 'DBName'
db가 존재하는지 알아야만 만들 때 오류가 발생하지 않으면 (From here )을 사용 하십시오 .
CREATE DATABASE IF NOT EXISTS DBName;
데이터베이스가 있는지 확인하는 간단한 방법은 다음과 같습니다.
SHOW DATABASES LIKE 'dbname';
이름이 'dbname'인 데이터베이스가 존재하지 않으면 빈 세트가 나타납니다. 존재하면 하나의 행을 얻습니다.
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
}
다른 대안은 데이터베이스를 사용하는 것입니다. 권한도 확인합니다.
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
부분은 종료 코드를 확인합니다.
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
을 원하는 데이터베이스 이름으로 바꾸고 생성기 스크립트를 전혀 변경하지 않아도됩니다. 누구든지 이것을 향상시킬 수 있다면 알려주십시오!
참고
PHP 도구와 함께 Visual Studio를 사용하지 않는 경우 지역에 대해 걱정하지 마십시오.
레일즈 코드 :
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}'"
골랑 솔루션
테스트 패키지를 작성하고 다음을 추가하십시오.
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")
}
}
같은 진술로 존재를 확인할 때 조심하십시오!
일련의 불행한 이벤트에서 변수가 비어 있으면 다음과 같이 실행됩니다.
SHOW DATABASES like '' -- dangerous!
모든 데이터베이스 를 리턴 하므로 일부 행이 리턴 된 이후 호출 스크립트에 존재 함을 알려줍니다.
존재 여부를 테스트하기 위해 "=" 등호 를 사용하는 것이 훨씬 안전하고 좋습니다 .
존재를 테스트하는 정확하고 안전한 방법은 다음과 같아야합니다.
SHOW DATABASES WHERE `database` = 'xxxxx' -- safe way to test for existence
컬럼 이름 데이터베이스를 백틱으로 랩핑해야하므로이 경우 완화 구문을 사용할 수 없습니다.
이런 식으로 변수 'xxxxx'를 작성하는 코드가 공백을 리턴하면 SHOW DATABASES는 모든 데이터베이스를 리턴하지 않지만 빈 세트를 리턴합니다.