अगर mysql डेटाबेस मौजूद है तो कैसे जांचें


292

क्या यह संभव है कि एक कनेक्शन बनाने के बाद (MySQL) डेटाबेस मौजूद है या नहीं।

मुझे पता है कि कैसे जांचना है कि क्या तालिका किसी DB में मौजूद है, लेकिन मुझे यह जाँचने की आवश्यकता है कि क्या DB मौजूद है। यदि नहीं, तो मुझे इसे बनाने और इसे आबाद करने के लिए किसी अन्य कोड को कॉल करना होगा।

मुझे पता है कि यह सब कुछ अटपटा लगता है - यह एक त्वरित और गंदा ऐप है।

जवाबों:


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

यदि आपको यह जानना आवश्यक है कि क्या कोई db मौजूद है तो आपको इसे बनाने का प्रयास करने पर कोई त्रुटि नहीं मिलेगी, बस उपयोग करें ( यहाँ से ):

CREATE DATABASE IF NOT EXISTS DBName;

9
पहला अच्छा। दूसरा कोई इतना नहीं। आपके पास डेटाबेस निर्माण विशेषाधिकार नहीं हो सकता है।
ओ। जोन्स

21
@ OllieJones दूसरा भी अच्छा है, यदि ओपी एक डेटाबेस बनाना चाहता है, तो उत्तरदाता मान रहा है
nawfal

3
सभी कैप्स में "INFORMATION_SCHEMA" क्यों है? मेरे साथ यह सभी निचले मामलों में है
हब्रो

3
* ठीक है, जाहिरा तौर पर PHPMyAdmin सिर्फ निचले मामले में सभी डेटाबेस नामों को प्रदर्शित करता है, और आपकी क्वेरी वैसे भी दोनों का उपयोग करके काम करती है
हब्रो

1
@Nawfal से सहमत; मैं DB बनाना नहीं चाहता, बस पता है कि यह मौजूद है।
स्टीविन्क

122

एक डेटाबेस मौजूद है, यह जाँचने का एक सरल तरीका:

SHOW DATABASES LIKE 'dbname';

यदि 'dbname' नाम का डेटाबेस मौजूद नहीं है, तो आपको एक खाली सेट मिलता है। यदि यह मौजूद है, तो आपको एक पंक्ति मिलती है।


1
बेहतर काम किया तो समाधान सही चिह्नित। धन्यवाद]
जॉन विलियम्स

इस अच्छे उत्तर की व्याख्या करने वाली आधिकारिक जानकारी के लिए, आधिकारिक वेबसाइट के दस्तावेज़ पृष्ठ पर जाएं, जो कमांड के बारे में है: dev.mysql.com/doc/refman/5.5/en/show-dat डेटाबेस.html (एक उपयोगी ट्यूटोरियल पेज ने मुझे इसके लिए प्रेरित किया, देव .mysql.com / doc / refman / 5.5 / en / database-use.html ("MySQL 5.5 संदर्भ मैनुअल / ट्यूटोरियल / बनाना और डेटाबेस का उपयोग करना")
एडवर्ड

2
यह सीधे INFORMATION_SCHEMA को उद्धृत करने की तुलना में धीमा हो सकता है, लेकिन यह बहुत अधिक पठनीय और समझने में आसान है, जो मेरे मामले में अधिक महत्वपूर्ण विचार था।
डैनियल हॉवर्ड

यह एक बेहतर समाधान है क्योंकि यदि आप डेटाबेस के अस्तित्व के लिए परीक्षण करते हैं तो आप इसे बनाना चाहते हैं। यदि "डेटाबेस मौजूद नहीं है तो बनाएँ" कष्टप्रद है क्योंकि यदि डेटाबेस में कोई भी निम्न कोड मौजूद है तो टेबल को परिभाषित करेगा। मैं यह नहीं देख सकता कि कमांड कैसे उपयोगी है।
कीर

@ केईर यह कष्टप्रद लग सकता है, एक ही समय में एक ही डेटाबेस बनाने की कोशिश कर रहे दो धागों की कल्पना करें और एक असफल होने पर क्या होगा। हालांकि यह निर्धारित करने के लिए उपयोगी नहीं है कि कोई डेटाबेस इसे बनाने की कोशिश करने से पहले मौजूद है, यह टकराव को रोकने के लिए उपयोगी है जबकि कई थ्रेड इसे बनाने की कोशिश कर रहे होंगे।
ब्रोगन

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" INFORMATION_SCHEMA से उपलब्ध SCHEMA_NAME। SCHEMA_NAME = 'db ""); अगर [-z "$ परिणाम"]; तब गूंज "डीबी मौजूद नहीं है"; फाई
स्टीवन ग्रीन

1
@ स्टीवनग्रीन का अनुकूलन ठीक काम करता है, इसलिए बैश / एसक्यूएल स्निपेट के लिए +1।
बोबले

अपना उपयोगकर्ता विवरण, कमांड लाइन या .my.cnf पर शामिल करना न भूलें।
श्री गोबरी

11

यदि डेटाबेस मौजूद है, तो जाँच के लिए यहाँ एक बश फ़ंक्शन है:

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 ...
बोबले

@Busble >/dev/nullरनिंग से निकास कोड नहीं बदलता है mysql। यदि कोई त्रुटि होती है तो यह आउटपुट को छिपा देता है। if ...; thenहिस्सा बाहर निकलने के कोड की जाँच करता है।
docwhat

9

एक डेटाबेस में मौजूद है अगर जाँच करने के लिए एक शानदार तरीका है:

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

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

यह वह विधि है जिसका मैं हमेशा उपयोग करता हूं।


7

एक बहुत ही सरल BASH- वन-लाइनर:

mysqlshow | grep dbname



4

जो लोग mysqli के साथ 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

बैश का उपयोग करना:

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डेटाबेस के नाम को अपनी पसंद के किसी भी डेटाबेस के नाम से बदल सकते हैं और निर्माता की स्क्रिप्ट को किसी भी चीज़ में बदल सकते हैं और (उम्मीद है!) इसे नहीं तोड़ेंगे। अगर कोई इसे सुधार सकता है, तो मुझे बताएं!

नोट
यदि आप 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_development1 मौजूद है, entos_development1 मौजूद नहीं है



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 समाधान, लेकिन पीडीओ के साथ:

<?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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.