MySQL veritabanı olup olmadığını kontrol etme


293

Bir bağlantı yaptıktan sonra (MySQL) veritabanının mevcut olup olmadığını kontrol etmek mümkün mü?

Bir tablo bir DB var olup olmadığını kontrol etmek biliyorum, ama DB var olup olmadığını kontrol etmek gerekir. Değilse ben oluşturmak ve doldurmak için başka bir kod parçası çağırmak zorunda.

Bu tüm seslerin biraz yetersiz olduğunu biliyorum - bu hızlı ve kirli bir uygulama.

Yanıtlar:


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

Eğer, bunu oluşturmak basitçe (Dan kullanmaya çalıştığınızda bir hata almazsınız bu yüzden bir db varsa sadece bilmeniz gerekiyorsa burada ):

CREATE DATABASE IF NOT EXISTS DBName;

9
İlk iyi. İkincisi o kadar da değil. Veritabanı oluşturma ayrıcalığınız olmayabilir.
O. Jones

21
@OllieJones ikincisi de iyi, OP OP bir veritabanı oluşturmak istiyorsa
cevap veriyor

3
Neden "BİLGİ_SCHEMA" tüm başlıklarda? Benimle her şey küçük
Hubro

3
* Tamam, görünüşe göre PHPMyAdmin tüm veritabanı adlarını küçük harflerle gösteriyor ve sorgunuz her ikisini de kullanıyor
Hubro

1
@Nawfal ile aynı fikirde; Ben DB oluşturmak istemeyebilir, sadece var olup olmadığını biliyorum.
SteveCinq

122

Veritabanının olup olmadığını kontrol etmenin basit bir yolu:

SHOW DATABASES LIKE 'dbname';

'Dbname' adlı veritabanı yoksa, boş bir küme alırsınız. Varsa, bir satır alırsınız.


1
Çözüm doğru işaretlendikten sonra daha iyi çalıştı. Teşekkürler]
John williams

Bu iyi yanıtı açıklayan resmi bilgiler için, resmi web sitesinin komut hakkındaki dokümantasyon sayfasına gidin: dev.mysql.com/doc/refman/5.5/en/show-databases.html (yararlı bir eğitim sayfası beni yönlendirdi, dev .mysql.com / doc / refman / 5.5 / tr / database-use.html ("MySQL 5.5 Başvuru Kılavuzu / Eğitim / Veritabanı Oluşturma ve Kullanma")
Edward

2
Bu doğrudan BİLGİ_SCHEMA'yı sorgulamaktan daha yavaş olabilir, ancak benim durumumda daha önemli olan, çok daha okunabilir ve anlaşılması kolay.
Daniel Howard

Bu daha iyi bir çözümdür, çünkü bir veritabanının varlığını test ederseniz, onu oluşturmak isteyebilirsiniz. "Eğer veritabanı yoksa" can sıkıcıdır çünkü veritabanı varsa tabloları tanımlamak için aşağıdaki kodlar bombalanır. Komutun ne kadar yararlı olduğunu göremiyorum.
Keir

@Keir Rahatsız edici görünse de, aynı veritabanını aynı anda oluşturmaya çalışan iki iş parçacığı ve biri başarısız olursa ne olacağını hayal edin. Bir veritabanını oluşturmaya çalışmadan önce var olup olmadığını belirlemek için yararlı olmasa da, birden çok iş parçacığı oluşturmaya çalışırken çakışmaları önlemek için kullanışlıdır.
Brogan

22

Bir php betiği arıyorsanız aşağıya bakın.

$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

Kabuktan bash gibi

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
Bu gerçekten işe yaramaz ... Bunun yerine şöyle bir şey deneyin: `sonuç = $ (mysql -s -N -e" BİLGİ_SCHEMA.SCHEMATA NEREDE SCHEMA_NAME = 'db' "'den SCHEMA_NAME SEÇİN; eğer [-z "$ sonuç"]; o zaman yankı "db mevcut değildir"; fi
Steven Green

1
@ StevenGreen'in buna adaptasyonu iyi çalışıyor, bu yüzden bash / sql snippet'i için +1.
Bobble

Kullanıcı bilgilerinizi komut satırına veya .my.cnf yoluyla eklemeyi unutmayın.
Bay Goobri

11

İşte bir veritabanı olup olmadığını kontrol etmek için bir bash işlevi:

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
}           

Başka bir alternatif de sadece veritabanını kullanmaya çalışmaktır. Bunun izni de kontrol ettiğini unutmayın:

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

Alternatif için +1, ancak >/dev/nullsonucun her zaman null olduğunu garanti eder. Gibi bir şey deneyin if [ -z "$(mysql ${db} 2>&1 </dev/null)" ]; then ....
Bobble

@Bobble >/dev/nullÇıkış kodunun çalışmasını değiştirmez mysql. Bir hata varsa çıktıyı gizler. if ...; thenBölüm çıkış kodu denetler.
docwhat

9

PHP'de bir veritabanı olup olmadığını kontrol etmenin harika bir yolu:

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

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

Her zaman kullandığım yöntem bu.


7

Çok basit bir BASH-tek astar:

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

MySQL ile php kullananlar için o zaman bu benim çözümdür. Cevabın zaten cevaplandığını biliyorum, ama cevabı mysqli tarafından hazırlanmış bir açıklama olarak almanın yararlı olacağını düşündüm.

$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 kullanma:

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

Uzun sargılı ve kıvrımlı (ama benimle ayı!), İşte bir DB olup olmadığını kontrol etmek ve ayrıca gerekli tabloları oluşturmak için yaptığım bir sınıf sistemi:

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

Burada enveritabanı adını istediğiniz herhangi bir veritabanı adıyla değiştirebilir ve aynı zamanda içerik oluşturucu komut dosyasını herhangi bir şeye değiştirebilirsiniz ve (umarım!) Kırılmaz. Birisi bunu düzeltebilirse bana bildirin!

Not
PHP araçlarıyla Visual Studio kullanmıyorsanız, bölgeler hakkında endişelenmeyin, bunlar kod katlama içindir: P


2

Bu Script ile Evet veya Hayır veritabanı elde edebilirsiniz, mevcut olmaması halinde İstisna atmaz.

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

1

Raylar Kodu:

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 var, entos_development1 mevcut değil



1

Ben sadece aşağıdaki sorguyu kullanıyorum:

"USE 'DBname'"

Sonra sonucun YANLIŞ olup olmadığını kontrol edin. Aksi takdirde, erişim reddedildi hatası olabilir, ancak bunu bilemiyorum. Dolayısıyla, ayrıcalıklar söz konusu olduğunda aşağıdakiler kullanılabilir:

"SHOW DATABASES LIKE 'DBname'"

daha önce de belirtildiği gibi.


1

İşte bunu bir bash betiği içinde yapmanın yolu:

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

Aşağıdaki çözüm benim için çalıştı:

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

0

PDO ile başka bir php çözümü:

<?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 çözümü

bir test paketi oluşturun ve ekleyin:

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

Benzer bir ifadeyle varlığını kontrol ederken dikkatli olun!

Bir dizi talihsiz olayda değişkeniniz boş kalır ve bunu yaparsınız:

SHOW DATABASES like '' -- dangerous!

TÜM veritabanlarını döndürür , böylece çağıran komut dosyasına bazı satırlar döndürüldüğünden beri var olduğunu söyler.

Varlığı test etmek için "=" eşittir işareti kullanmak çok daha güvenli ve daha iyi bir uygulamadır .

Varlığı test etmenin doğru ve güvenli yolu:

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

Sütun adı veritabanını ters tırnaklarla sarmanız gerektiğini unutmayın, bu durumda rahat sözdizimini kullanamaz.

Bu şekilde, 'xxxxx' değişkenini oluşturan kod boş döndürülürse, VERİTABANLARINI GÖSTER TÜM veritabanlarını döndürmez, ancak boş bir küme döndürür.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.