كيفية التحقق من وجود قاعدة بيانات MySQL
سؤال
هل من الممكن التحقق من وجود قاعدة بيانات (MySQL) بعد إجراء الاتصال.
أعرف كيفية التحقق من وجود جدول في قاعدة البيانات، ولكنني بحاجة إلى التحقق من وجود قاعدة البيانات.إذا لم يكن الأمر كذلك، فلا بد لي من استدعاء جزء آخر من التعليمات البرمجية لإنشائه وملؤه.
أعلم أن كل هذا يبدو غير أنيق إلى حد ما - فهذا تطبيق سريع وقذر.
المحلول
SELECT SCHEMA_NAME
FROM INFORMATION_SCHEMA.SCHEMATA
WHERE SCHEMA_NAME = 'DBName'
إذا كنت بحاجة فقط لمعرفة ما إذا كان يوجد ديسيبل حتى أنك لن تحصل على خطأ عند محاولة إنشائه، لمجرد استخدام (من <لأ href = "http://forums.mysql.com/read.php ؟ 101،213455،213496 "يختلط =" noreferrer "> هنا ):
CREATE DATABASE IF NOT EXISTS DBName;
نصائح أخرى
وهناك طريقة بسيطة لمعرفة ما اذا كان وجود قاعدة البيانات:
SHOW DATABASES LIKE 'dbname';
وإذا كانت قاعدة البيانات مع 'DBNAME' اسم غير موجود، وتحصل على مجموعة فارغة. إذا كان لا وجود لها، وتحصل على صف واحد.
إذا كنت تبحث عن برنامج نصي بى انظر أدناه.
$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());
}
ومن قذيفة مثل باش
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
وهنا هي وظيفة باش لفحص حالة وجود قاعدة بيانات:
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
وهناك طريقة رائعة لمعرفة ما اذا كان وجود قاعدة البيانات في PHP هي:
$mysql = mysql_connect("<your host>", "root", "");
if (mysql_select_db($mysql, '<your db name>')) {
echo "Database exists";
} else {
echo "Database does not exist";
}
وهذا هو الأسلوب الذي أنا دائما استخدام.
وبسيطة جدا BASH-أونيلينير:
mysqlshow | grep dbname
CREATE SCHEMA IF NOT EXISTS `demodb` DEFAULT CHARACTER SET utf8 ;
SELECT IF('database_name' IN(SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA), 1, 0) AS found;
وبالنسبة لأولئك الذين يستخدمون فب مع mysqli ثم وهذا هو الحل بلدي. وأنا أعلم وقد تم بالفعل أجاب الجواب، لكنني اعتقد انه سيكون من المفيد أن يكون الجواب في بيان 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();
وعن طريق باش:
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
طويل ومعقد (لكن تحملني!) ، إليك نظام فصلي قمت بإنشائه للتحقق من وجود قاعدة بيانات وأيضًا لإنشاء الجداول المطلوبة:
<?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
والقضبان الرمز:
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
إذا كنت تستخدم MSSQL بدلا من الخلية، ونرى هذا <وأ href = "https://stackoverflow.com/questions/679000/how-to-check-if-a-database-exists-in-sql-server "> الجواب من موضوع مشابه .
وأستخدمه ببساطة الاستعلام التالي:
"USE 'DBname'"
وبعد ذلك معرفة ما اذا كان النتيجة هي FALSE. خلاف ذلك، قد يكون هناك خطأ رفض الوصول، ولكن لا أستطيع أن أعرف ذلك. لذا، في حالة امتيازات المعنية، يمكن للمرء أن استخدام:
"SHOW DATABASES LIKE 'DBname'"
وكما سبق ذكره في وقت سابق.
ومع هذا السيناريو يمكنك الحصول على نعم أو لا وجود لقاعدة البيانات، في حال لم يكن موجودا فإنه لا رمي استثناء.
SELECT
IF(EXISTS( SELECT
SCHEMA_NAME
FROM
INFORMATION_SCHEMA.SCHEMATA
WHERE
SCHEMA_NAME = 'DbName'),
'Yes',
'No') as exist
وحل بعد بالنسبة لي:
mysql -u${MYSQL_USER} -p${MYSQL_PASSWORD} \
-s -N -e "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME='${MYSQL_DATABASE}'"