วิธีการตรวจสอบว่ามีฐานข้อมูล MySQL อยู่หรือไม่


293

เป็นไปได้ไหมที่จะตรวจสอบว่ามีฐานข้อมูล (MySQL) อยู่หลังจากทำการเชื่อมต่อหรือไม่

ฉันรู้วิธีตรวจสอบว่ามีตารางอยู่ในฐานข้อมูลหรือไม่ แต่ต้องตรวจสอบว่ามีฐานข้อมูลอยู่หรือไม่ ถ้าไม่ฉันต้องเรียกรหัสอื่นเพื่อสร้างและเติมมัน

ฉันรู้ว่าทั้งหมดนี้ฟังดูค่อนข้างไม่เหมาะสม - นี่เป็นแอพที่รวดเร็วและสกปรก

คำตอบ:


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

หากคุณเพียงแค่ต้องรู้ว่ามีฐานข้อมูลอยู่หรือไม่ดังนั้นคุณจะไม่ได้รับข้อผิดพลาดเมื่อพยายามสร้างมันให้ใช้ (จากที่นี่ ):

CREATE DATABASE IF NOT EXISTS DBName;

9
ก่อนใครดี คนที่สองไม่มาก คุณอาจไม่มีสิทธิ์ในการสร้างฐานข้อมูล
O. Jones

21
@OllieJones สองเป็นสิ่งที่ดีเกินไปผู้ตอบคือสมมติถ้า OP ต้องการที่จะสร้างฐานข้อมูล
Nawfal

3
เหตุใดจึงเป็น "INFORMATION_SCHEMA" ในตัวพิมพ์ใหญ่ทั้งหมด กับฉันมันเป็นตัวพิมพ์เล็กทั้งหมด
Hubro

3
* ตกลง, เห็นได้ชัดว่า PHPMyAdmin จะแสดงชื่อฐานข้อมูลทั้งหมดเป็นตัวพิมพ์เล็กและแบบสอบถามของคุณสามารถใช้งานได้ทั้งคู่
Hubro

1
เห็นด้วยกับ @nawfal; ฉันอาจไม่ต้องการสร้างฐานข้อมูลเพียงแค่รู้ว่ามันมีอยู่
SteveCinq

122

วิธีง่ายๆในการตรวจสอบว่ามีฐานข้อมูลอยู่หรือไม่:

SHOW DATABASES LIKE 'dbname';

หากฐานข้อมูลที่มีชื่อ 'dbname' ไม่มีอยู่คุณจะได้รับชุดว่างเปล่า หากมีอยู่คุณจะได้หนึ่งแถว


1
ทำงานได้ดีขึ้นจากนั้นโซลูชันทำเครื่องหมายถูกต้อง ขอบคุณ]
John williams

สำหรับข้อมูลอย่างเป็นทางการที่อธิบายคำตอบที่ดีนี้ไปที่หน้าเอกสารประกอบของเว็บไซต์อย่างเป็นทางการเกี่ยวกับคำสั่ง: dev.mysql.com/doc/refman/5.5/th/show-databases.html (หน้าบทช่วยสอนที่มีประโยชน์นำฉันมาที่dev .mysql.com / doc / refman / 5.5 / en / database-use.html ("MySQL 5.5 คู่มืออ้างอิง / การสอน / การสร้างและการใช้ฐานข้อมูล")
Edward

2
สิ่งนี้อาจช้ากว่าการสืบค้น INFORMATION_SCHEMA โดยตรง แต่มันสามารถอ่านได้และเข้าใจง่ายกว่าซึ่งเป็นข้อพิจารณาที่สำคัญกว่าในกรณีของฉัน
Daniel Howard

นี่เป็นทางออกที่ดีกว่าเพราะถ้าคุณทดสอบการมีอยู่ของฐานข้อมูลคุณอาจต้องการสร้างมัน "สร้างฐานข้อมูลหากไม่มี" น่ารำคาญเพราะหากฐานข้อมูลไม่มีรหัสต่อไปนี้เพื่อกำหนดตารางจะระเบิด ฉันไม่เห็นว่าคำสั่งนี้มีประโยชน์อย่างไร
Keir

@ 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 "$ ผลลัพธ์"]; echo "db ไม่มีอยู่"; fi
Steven Green

1
@ การปรับตัวของ StevenGreen ทำงานได้ดีดังนั้น +1 สำหรับตัวอย่างข้อมูล bash / sql
Bobble

อย่าลืมที่จะรวมถึงรายละเอียดผู้ใช้ของคุณทั้งในบรรทัดคำสั่งหรือผ่าน. my.cnf
Mr Goobri

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

@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 แล้วนี่คือทางออกของฉัน ฉันรู้ว่าคำตอบนั้นได้รับการตอบแล้ว แต่ฉันคิดว่ามันจะเป็นประโยชน์หากมีคำตอบเช่นเดียวกับคำสั่งที่เตรียมโดย 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

ใช้ทุบตี:

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 ไม่ต้องกังวลกับภูมิภาค


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
IF EXISTS (SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = N'YourDatabaseName')
BEGIN    
    -- Database exists, so do your stuff here.
END

หากคุณกำลังใช้ MSSQL แทน MySQL, เห็นนี้คำตอบจากหัวข้อที่คล้ายกัน


นี่สำหรับ MSSQL ไม่ใช่ MySQL
Erin Drummond

1

ฉันใช้เพียงแค่แบบสอบถามต่อไปนี้:

"USE 'DBname'"

จากนั้นตรวจสอบว่าผลลัพธ์เป็น FALSE หรือไม่ มิฉะนั้นอาจมีข้อผิดพลาดถูกปฏิเสธการเข้าถึง แต่ฉันไม่สามารถรู้ได้ ดังนั้นในกรณีที่เกี่ยวข้องกับสิทธิ์ผู้ใช้สามารถใช้:

"SHOW DATABASES LIKE 'DBname'"

ดังที่ได้กล่าวไปแล้วก่อนหน้านี้


1

นี่คือวิธีการของฉันในสคริปต์ทุบตี:

#!/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

สารละลาย Golang

สร้างแพ็คเกจทดสอบและเพิ่ม:

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

ระวังเมื่อตรวจสอบการมีอยู่ด้วยคำสั่ง like!

หากในชุดของเหตุการณ์ที่โชคร้ายตัวแปรของคุณจะว่างเปล่าและคุณจะดำเนินการสิ่งนี้:

SHOW DATABASES like '' -- dangerous!

มันจะส่งคืนฐานข้อมูลทั้งหมดดังนั้นจึงแจ้งสคริปต์การโทรว่ามีอยู่ตั้งแต่บางแถวถูกส่งคืน

เป็นวิธีที่ปลอดภัยและดีกว่ามากในการใช้เครื่องหมาย"="เท่ากันเพื่อทดสอบการมีอยู่

วิธีที่ถูกต้องและปลอดภัยในการทดสอบการมีอยู่ควรเป็น:

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

โปรดทราบว่าคุณต้องตัดฐานข้อมูลชื่อคอลัมน์ด้วย backticks มันไม่สามารถใช้ไวยากรณ์ที่ผ่อนคลายในกรณีนี้

ด้วยวิธีนี้หากรหัสที่สร้างตัวแปร 'xxxxx' คืนค่าว่างแสดง SHOW DATABASES จะไม่ส่งคืนฐานข้อมูลทั้งหมด แต่จะส่งคืนชุดว่าง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.