Làm thế nào để kiểm tra nếu cơ sở dữ liệu mysql tồn tại


292

Có thể kiểm tra xem cơ sở dữ liệu (MySQL) có tồn tại sau khi đã thực hiện kết nối không.

Tôi biết cách kiểm tra nếu một bảng tồn tại trong DB, nhưng tôi cần kiểm tra xem DB có tồn tại không. Nếu không tôi phải gọi một đoạn mã khác để tạo nó và điền vào nó.

Tôi biết tất cả điều này nghe có vẻ không phù hợp - đây là một ứng dụng nhanh và bẩn.

Câu trả lời:


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

Nếu bạn chỉ cần biết nếu một db tồn tại để bạn sẽ không gặp lỗi khi bạn cố gắng tạo nó, chỉ cần sử dụng (Từ đây ):

CREATE DATABASE IF NOT EXISTS DBName;

9
Đầu tiên tốt. Thứ hai không quá nhiều. Bạn có thể không có đặc quyền tạo cơ sở dữ liệu.
O. Jones

21
@OllieJones thứ hai cũng tốt, người trả lời sẽ giả sử nếu OP muốn tạo cơ sở dữ liệu
nawfal

3
Tại sao "THÔNG TIN_SCHema" trong tất cả các mũ? Với tôi, đó là trong tất cả các trường hợp thấp hơn
Hubro

3
* OK, rõ ràng PHPMyAdmin chỉ hiển thị tất cả các tên cơ sở dữ liệu bằng chữ thường và truy vấn của bạn vẫn hoạt động bằng cả hai cách
Hubro

1
Đồng ý với @nawfal; Tôi có thể không muốn tạo DB, chỉ cần biết nếu nó tồn tại.
SteveCinq

122

Một cách đơn giản để kiểm tra nếu cơ sở dữ liệu tồn tại là:

SHOW DATABASES LIKE 'dbname';

Nếu cơ sở dữ liệu có tên 'dbname' không tồn tại, bạn sẽ có được một bộ trống. Nếu nó tồn tại, bạn nhận được một hàng.


1
Làm việc tốt hơn thì giải pháp đánh dấu đúng. Cảm ơn]
John williams

Để biết thông tin chính thức giải thích câu trả lời hay này, hãy truy cập trang tài liệu chính thức của trang web về lệnh: dev.mysql.com/doc/refman/5.5/en/show-database.html (một trang hướng dẫn hữu ích đã đưa tôi đến đó, dev .mysql.com / doc / refman / 5.5 / en / database-use.html ("Hướng dẫn tham khảo MySQL 5.5 / Hướng dẫn / Tạo và sử dụng cơ sở dữ liệu")
Edward

2
Điều này có thể chậm hơn so với truy vấn trực tiếp Information_SCHema, nhưng nó dễ đọc và dễ hiểu hơn nhiều, đó là sự cân nhắc quan trọng hơn trong trường hợp của tôi.
Daniel Howard

Đây là một giải pháp tốt hơn bởi vì nếu bạn kiểm tra sự tồn tại của cơ sở dữ liệu thì bạn có thể muốn tạo nó. "Tạo cơ sở dữ liệu nếu không tồn tại" gây phiền nhiễu vì nếu cơ sở dữ liệu tồn tại bất kỳ mã nào sau đây để xác định các bảng sẽ đánh bom. Tôi không thể thấy lệnh này hữu ích như thế nào.
Keir

@Keir Mặc dù có vẻ khó chịu, hãy tưởng tượng hai luồng cố gắng tạo cùng một cơ sở dữ liệu cùng một lúc và điều gì sẽ xảy ra nếu một lần thất bại. Mặc dù nó không hữu ích để xác định xem cơ sở dữ liệu có tồn tại trước khi thử tạo nó hay không, nhưng nó rất hữu ích để ngăn ngừa va chạm trong khi nhiều luồng có thể đang cố tạo nó.
Brogan

22

Nếu bạn đang tìm kiếm một tập lệnh php xem bên dưới.

$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

Từ vỏ như 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
Điều này không thực sự hoạt động ... Thay vào đó hãy thử một cái gì đó như: `result = $ (mysql -s -N -e" CHỌN SCHema_NAME TỪ THÔNG TIN_SCHema.SCHEMATA WHERE SCHema_NAME = 'db' "); nếu [-z "$ kết quả"]; sau đó lặp lại "db không tồn tại"; fi
Steven Green

1
@ Điều chỉnh của StevenGreen này hoạt động tốt, vì vậy +1 cho đoạn bash / sql.
Bobble

Đừng quên bao gồm các chi tiết người dùng của bạn, trên dòng lệnh hoặc thông qua .my.cnf.
Ông Goobri

11

Đây là một hàm bash để kiểm tra nếu cơ sở dữ liệu tồn tại:

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
}           

Một cách khác là chỉ cần cố gắng sử dụng cơ sở dữ liệu. Lưu ý rằng điều này cũng kiểm tra sự cho phép:

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 cho phương án thay thế, nhưng >/dev/nullđảm bảo kết quả luôn là null. Hãy thử một cái gì đó như if [ -z "$(mysql ${db} 2>&1 </dev/null)" ]; then ....
Bobble

@Bobble >/dev/nullKhông thay đổi mã thoát khỏi chạy mysql. Nó chỉ ẩn đầu ra nếu có lỗi. Phần if ...; thenkiểm tra mã thoát.
docwhat 7/07/2015

9

Một cách tuyệt vời để kiểm tra xem cơ sở dữ liệu có tồn tại trong PHP hay không là:

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

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

Đó là phương pháp mà tôi luôn sử dụng.


7

Một BASH-one-liner rất đơn giản:

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

Đối với những người sử dụng php với mysqli thì đây là giải pháp của tôi. Tôi biết câu trả lời đã được trả lời, nhưng tôi nghĩ sẽ rất hữu ích khi có câu trả lời như một tuyên bố chuẩn bị của 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

Sử dụng 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

Dài dòng và hỗn độn (nhưng hãy đồng ý với tôi!), Đây là một hệ thống lớp tôi đã thực hiện để kiểm tra xem DB có tồn tại không và cũng để tạo các bảng cần thiết:

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

Trong trường hợp này, bạn có thể thay thế tên cơ sở dữ liệu enbằng bất kỳ tên cơ sở dữ liệu nào bạn thích và cũng có thể thay đổi tập lệnh của người tạo thành bất kỳ thứ gì và (hy vọng!) Nó sẽ không phá vỡ nó. Nếu ai có thể cải thiện điều này, hãy cho tôi biết!

Lưu ý
Nếu bạn không sử dụng Visual Studio với các công cụ PHP, đừng lo lắng về các khu vực, chúng là để gấp mã: P


2

Với Script này, bạn có thể có cơ sở dữ liệu Có hoặc Không tồn tại, trong trường hợp không tồn tại, nó không ném Ngoại lệ.

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

1

Mã đường ray:

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 tồn tại, entos_development1 không tồn tại



1

Tôi đang sử dụng đơn giản các truy vấn sau đây:

"USE 'DBname'"

Sau đó kiểm tra xem kết quả có phải là FALSE không. Mặt khác, có thể có một lỗi từ chối truy cập, nhưng tôi không thể biết điều đó. Vì vậy, trong trường hợp đặc quyền liên quan, người ta có thể sử dụng:

"SHOW DATABASES LIKE 'DBname'"

như đã đề cập trước đó.


1

Đây là cách của tôi để làm điều đó trong một tập lệnh 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

Giải pháp sau đây làm việc cho tôi:

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

0

Một giải pháp php khác, nhưng với 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

Giải pháp Golang

tạo một gói thử nghiệm và thêm:

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

Hãy cẩn thận khi kiểm tra sự tồn tại với một tuyên bố thích!

Nếu trong một loạt các sự kiện không may, biến của bạn sẽ bị trống và cuối cùng bạn thực hiện điều này:

SHOW DATABASES like '' -- dangerous!

Nó sẽ trả về TẤT CẢ cơ sở dữ liệu, do đó thông báo cho tập lệnh gọi rằng nó tồn tại do một số hàng được trả về.

Thực hành tốt hơn và an toàn hơn nhiều khi sử dụng "=" dấu bằng để kiểm tra sự tồn tại.

Cách chính xác và an toàn để kiểm tra sự tồn tại phải là:

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

Lưu ý rằng bạn phải bọc cơ sở dữ liệu tên cột bằng backticks, nó không thể sử dụng cú pháp thoải mái trong trường hợp này.

Bằng cách này, nếu mã tạo biến 'xxxxx' được trả về trống, thì SHOW DATABASES sẽ không trả về TẤT CẢ cơ sở dữ liệu, nhưng sẽ trả về một tập hợp trống.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.