Bagaimana memeriksa apakah database mysql ada


292

Apakah mungkin untuk memeriksa apakah database (MySQL) ada setelah membuat koneksi.

Saya tahu cara memeriksa apakah tabel ada dalam DB, tapi saya perlu memeriksa apakah DB ada. Jika tidak, saya harus memanggil potongan kode lain untuk membuatnya dan mengisinya.

Saya tahu ini semua kedengarannya kurang bagus - ini adalah aplikasi cepat dan kotor.

Jawaban:


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

Jika Anda hanya perlu tahu apakah ada db sehingga Anda tidak akan mendapatkan kesalahan saat mencoba membuatnya, cukup gunakan (Dari sini ):

CREATE DATABASE IF NOT EXISTS DBName;

9
Yang pertama bagus. Yang kedua tidak begitu banyak. Anda mungkin tidak memiliki hak istimewa pembuatan basis data.
O. Jones

21
@OllieJones yang kedua juga bagus, penjawabnya mengasumsikan jika OP ingin membuat database
nawfal

3
Mengapa "INFORMATION_SCHEMA" ada di semua batas? Dengan saya itu dalam semua huruf kecil
Hubro

3
* OK, ternyata PHPMyAdmin hanya menampilkan semua nama basis data dalam huruf kecil, dan bagaimanapun juga permintaan Anda menggunakan keduanya
Hubro

1
Setuju dengan @nawfal; Saya mungkin tidak ingin membuat DB, hanya tahu apakah itu ada.
SteveCinq

122

Cara sederhana untuk memeriksa apakah ada database adalah:

SHOW DATABASES LIKE 'dbname';

Jika database dengan nama 'dbname' tidak ada, Anda mendapatkan set kosong. Jika memang ada, Anda mendapatkan satu baris.


1
Bekerja lebih baik daripada solusi yang ditandai benar. Terima kasih]
John williams

Untuk informasi resmi yang menjelaskan jawaban yang baik ini, buka halaman dokumentasi situs web resmi tentang perintah: dev.mysql.com/doc/refman/5.5/id/show-databases.html (halaman tutorial yang berguna mengarahkan saya ke sana, dev .mysql.com / doc / refman / 5.5 / en / database-use.html ("Manual Referensi / Tutorial MySQL 5.5 / Membuat dan Menggunakan Database").
Edward

2
Ini mungkin lebih lambat daripada secara langsung menanyakan INFORMATION_SCHEMA, tetapi jauh lebih mudah dibaca dan mudah dipahami, yang merupakan pertimbangan yang lebih penting dalam kasus saya.
Daniel Howard

Ini adalah solusi yang lebih baik karena jika Anda menguji keberadaan database Anda mungkin ingin membuatnya. "Buat database jika tidak ada" sangat mengganggu karena jika database memang ada, kode berikut untuk menentukan tabel akan dibom. Saya tidak bisa melihat bagaimana perintah ini berguna.
Keir

@ Geir Sementara itu mungkin tampak menjengkelkan, bayangkan dua utas mencoba membuat database yang sama pada waktu yang sama dan apa yang akan terjadi jika satu gagal. Meskipun tidak berguna untuk menentukan apakah ada basis data sebelum mencoba membuatnya, itu berguna untuk mencegah tabrakan sementara beberapa utas mungkin mencoba membuatnya.
Brogan

22

Jika Anda mencari skrip php lihat di bawah.

$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

Dari shell seperti 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

3
Ini tidak benar-benar bekerja ... Alih-alih coba sesuatu seperti: `result = $ (mysql -s -N -e" SELECT SCHEMA_NAME DARI INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'db' "); jika [-z "$ result"]; lalu gema "db tidak ada"; fi
Steven Green

1
@ Adaptasi StevenGreen untuk ini berfungsi dengan baik, jadi beri +1 untuk cuplikan bash / sql.
Bobble

Jangan lupa untuk memasukkan detail pengguna Anda, baik pada baris perintah atau via .my.cnf.
Tuan Goobri

11

Berikut adalah fungsi bash untuk memeriksa apakah ada database:

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
}           

Alternatif lain adalah dengan hanya mencoba menggunakan database. Perhatikan bahwa ini juga memeriksa izin:

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

Memberi +1 untuk alternatif, tetapi >/dev/nullmenjamin hasilnya selalu nol. Coba sesuatu seperti if [ -z "$(mysql ${db} 2>&1 </dev/null)" ]; then ....
Bobble

@ Bobble The >/dev/nulltidak mengubah kode keluar dari berjalan mysql. Itu hanya menyembunyikan output jika ada kesalahan. Bagian ini if ...; thenmemeriksa kode keluar.
docwhat

9

Cara yang bagus untuk memeriksa apakah database ada di PHP adalah:

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

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

Itulah metode yang selalu saya gunakan.


7

BASH-one-liner yang sangat sederhana:

mysqlshow | grep dbname

5
CREATE SCHEMA IF NOT EXISTS `demodb` DEFAULT CHARACTER SET utf8 ;

4
SELECT IF('database_name' IN(SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA), 1, 0) AS found;

4

Bagi mereka yang menggunakan php dengan mysqli maka ini adalah solusi saya. Saya tahu jawabannya sudah dijawab, tetapi saya pikir akan sangat membantu untuk memiliki jawabannya sebagai pernyataan mysqli yang disiapkan juga.

$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

Menggunakan 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

Long winded dan berbelit-belit (tapi tetap bersamaku!), Ini adalah sistem kelas yang saya buat untuk memeriksa apakah ada DB dan juga untuk membuat tabel yang diperlukan:

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

Dalam hal ini Anda dapat mengganti nama basis data en dengan apa pun yang Anda suka dan juga mengubah skrip pembuat menjadi apa saja dan (semoga!) Tidak akan merusaknya. Jika ada yang bisa memperbaiki ini, beri tahu saya!

Catatan
Jika Anda tidak menggunakan Visual Studio dengan alat PHP, jangan khawatir tentang daerah, mereka adalah untuk melipat kode: P


2

Dengan Skrip ini, Anda bisa mendapatkan Ya atau Tidak ada basis data, jika tidak ada, tidak membuang Exception.

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

1

Kode 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 ada, entos_development1 tidak ada


1
IF EXISTS (SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = N'YourDatabaseName')
BEGIN    
    -- Database exists, so do your stuff here.
END

Jika Anda menggunakan MSSQL sebagai ganti MySQL, lihat jawaban ini dari utas yang sama .


Ini untuk MSSQL, bukan MySQL
Erin Drummond

1

Saya hanya menggunakan kueri berikut:

"USE 'DBname'"

Kemudian periksa apakah hasilnya SALAH. Kalau tidak, mungkin ada kesalahan akses ditolak, tapi saya tidak tahu itu. Jadi, jika ada hak istimewa yang terlibat, seseorang dapat menggunakan:

"SHOW DATABASES LIKE 'DBname'"

seperti yang sudah disebutkan sebelumnya.


1

Inilah cara saya melakukannya di dalam skrip 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

Solusi berikut berhasil untuk saya:

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

0

Solusi php lain, tetapi dengan 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

Solusi golang

buat paket tes dan tambahkan:

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

Hati-hati saat memeriksa keberadaan dengan pernyataan serupa!

Jika dalam serangkaian peristiwa yang tidak menguntungkan, variabel Anda akhirnya kosong, dan Anda akhirnya menjalankan ini:

SHOW DATABASES like '' -- dangerous!

Ini akan mengembalikan SEMUA database, sehingga memberi tahu skrip panggilan bahwa itu ada sejak beberapa baris dikembalikan.

Jauh lebih aman dan lebih baik menggunakan tanda sama dengan "=" untuk menguji keberadaan.

Cara yang benar dan aman untuk menguji keberadaan harus:

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

Perhatikan bahwa Anda harus membungkus basis data nama kolom dengan backticks, karena itu tidak dapat menggunakan sintaks yang santai.

Dengan cara ini, jika kode yang membuat variabel 'xxxxx' dikembalikan kosong, maka SHOW DATABASES tidak akan mengembalikan SEMUA basis data, tetapi akan mengembalikan set kosong.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.