سؤال

هل من الممكن التحقق من وجود قاعدة بيانات (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}'"
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top