Як перевірити, чи існує база даних mysql


292

Чи можна перевірити, чи існує база даних (MySQL) після встановлення з'єднання.

Я знаю, як перевірити, чи існує таблиця в БД, але мені потрібно перевірити, чи існує БД. Якщо ні, то я повинен зателефонувати на інший фрагмент коду, щоб створити його та заповнити його.

Я знаю, це все звучить дещо неелегантно - це швидке та брудне додаток.

Відповіді:


463
SELECT SCHEMA_NAME
  FROM INFORMATION_SCHEMA.SCHEMATA
 WHERE SCHEMA_NAME = 'DBName'

Якщо вам просто потрібно знати, чи існує db, щоб ви не отримали помилку при спробі його створити, просто скористайтеся (From here ):

CREATE DATABASE IF NOT EXISTS DBName;

9
Перший хороший. Другий не так вже й багато. У вас може бути привілей на створення бази даних.
О. Джонс

21
@OllieJones також хороший другий, відповідач припускає, що ОП хоче створити базу даних
nawfal

3
Чому "INFORMATION_SCHEMA" у всіх кришках? Зі мною це зовсім в нижньому випадку
Hubro

3
* Гаразд, очевидно, що PHPMyAdmin просто відображає всі назви баз даних у
малому

1
Погодьтеся з @nawfal; Я, можливо, не захочу створювати БД, просто знаю, чи він існує.
SteveCinq

122

Простий спосіб перевірити наявність бази даних:

SHOW DATABASES LIKE 'dbname';

Якщо база даних з назвою 'dbname' не існує, ви отримуєте порожній набір. Якщо вона існує, ви отримуєте один ряд.


1
Працювали краще, ніж рішення позначено правильним. Спасибі]
Джон williams

Для отримання офіційної інформації, яка пояснює цю хорошу відповідь, перейдіть на сторінку документації на офіційному веб-сайті про команду: dev.mysql.com/doc/refman/5.5/uk/show-databases.html (корисна сторінка підручника привела мене до цього, дев. .mysql.com / doc / refman / 5.5 / en / database-use.html ("Довідковий посібник MySQL 5.5 / Підручник / Створення та використання бази даних").
Edward

2
Це може бути повільніше, ніж безпосередньо запитувати INFORMATION_SCHEMA, але це набагато більш читабельно та легко зрозуміти, що було важливішим у моєму випадку.
Даніель Говард

Це краще рішення, тому що якщо ви перевірите наявність бази даних, то, можливо, захочете її створити. "Створити базу даних, якщо її немає" дратує, тому що якщо база даних існує, будь-який наступний код для визначення таблиць буде бомбовим. Я не бачу, наскільки команда корисна.
Кейр

@Keir Хоча це може здатися прикрою, уявіть дві нитки, що намагаються створити одну і ту ж базу даних одночасно, і що буде, якщо одна не вдасться. Хоча це не корисно для визначення, чи існує база даних, перш ніж намагатися її створити, вона корисна для запобігання зіткнень, тоді як кілька потоків можуть намагатися її створити.
Броган

22

Якщо ви шукаєте скрипт для 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());
}

22

З оболонки, як баш

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

3
Насправді це не працює ... Натомість спробуйте щось на зразок: `result = $ (mysql -s -N -e" SELECT SCHEMA_NAME З INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'db' "); якщо [-z "$ результат"]; тоді відлуння "db не існує"; fi
Стівен Грін

1
@ Адаптація StevenGreen це працює чудово, тому +1 для фрагмента bash / sql.
Боббл

Не забудьте вказати свої дані користувача або в командному рядку, або через .my.cnf.
Містер Губрі

11

Ось функція 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

+1 для альтернативи, але >/dev/nullгарантує, що результат завжди є недійсним. Спробуйте щось подібне if [ -z "$(mysql ${db} 2>&1 </dev/null)" ]; then ....
Боббл

@Bobble Вихідний >/dev/nullкод не змінюється mysql. Він просто приховує вихід, якщо є помилка. if ...; thenЧастина перевіряє код виходу.
docwhat

9

Прекрасний спосіб перевірити, чи існує база даних у PHP:

$mysql = mysql_connect("<your host>", "root", "");

if (mysql_select_db($mysql, '<your db name>')) {
    echo "Database exists";
} else {
    echo "Database does not exist";
}

Це метод, який я завжди використовую.





4

Для тих, хто використовує 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();

4

Використання bash:

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

2

Довго звивисті і згорнуті (але майте на собі!), Ось система класів, яку я створив, щоб перевірити, чи існує БД, а також створити необхідні таблиці:

<?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


2

За допомогою цього сценарію ви можете отримати Так або Ніяка база даних не існує, якщо вона не існує, вона не кидає виняток.

SELECT 
    IF(EXISTS( SELECT 
                SCHEMA_NAME
            FROM
                INFORMATION_SCHEMA.SCHEMATA
            WHERE
                SCHEMA_NAME = 'DbName'),
        'Yes',
        'No')  as exist

1

Код рейки:

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 не існує



1

Я використовую просто такий запит:

"USE 'DBname'"

Потім перевірте, чи результат ЛЕГИЙ. В іншому випадку може бути помилка, заборонена в доступі, але я не можу цього знати. Отже, у разі залучення пільг можна використовувати:

"SHOW DATABASES LIKE 'DBname'"

як уже згадувалося раніше.


1

Ось мій спосіб зробити це всередині 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

0

Наступне рішення працювало для мене:

mysql -u${MYSQL_USER} -p${MYSQL_PASSWORD} \
-s -N -e "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME='${MYSQL_DATABASE}'"

0

Ще одне рішення php, але з PDO:

<?php
try {
   $pdo = new PDO('mysql:host=localhost;dbname=dbname', 'root', 'password');
   echo 'table dbname exists...';
}
catch (PDOException $e) {
   die('dbname not found...');
}

0

Розчин Голанга

створити тестовий пакет і додати:

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")
    }

} 

0

Будьте уважні, перевіряючи наявність із подібним твердженням!

Якщо в ряді нещасних подій ваша змінна в кінцевому підсумку виявляється порожньою, і ви закінчите це:

SHOW DATABASES like '' -- dangerous!

Він поверне ВСІ БД, тим самим повідомляючи викликаючий сценарій, що він існує з моменту повернення деяких рядків.

Набагато безпечніше і краща практика використовувати знак рівності "=" для перевірки на існування.

Правильним і безпечним способом перевірки на наявність має бути:

SHOW DATABASES WHERE `database` = 'xxxxx' -- safe way to test for existence

Зауважте, що вам потрібно обернути базу даних імен стовпців за допомогою зворотних посилань, вона не може використовувати розслаблений синтаксис у цьому випадку.

Таким чином, якщо код, що створює змінну 'xxxxx', повернувся порожнім, то SHOW DATABASES не поверне ВСІ БД, але поверне порожній набір.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.