MySQL 데이터베이스가 있는지 확인하는 방법


292

연결 한 후 (MySQL) 데이터베이스가 존재하는지 확인할 수 있습니까?

DB에 테이블이 있는지 확인하는 방법을 알고 있지만 DB가 있는지 확인해야합니다. 그렇지 않으면 다른 코드를 호출하여 작성하고 채울 필요가 있습니다.

나는이 모든 것이 다소 우아하지 않다는 것을 알고 있습니다. 이것은 빠르고 더러운 앱입니다.

답변:


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

db가 존재하는지 알아야만 만들 때 오류가 발생하지 않으면 (From here )을 사용 하십시오 .

CREATE DATABASE IF NOT EXISTS DBName;

9
첫 번째 좋은. 두 번째는 그리 많지 않습니다. 데이터베이스 작성 권한이 없을 수 있습니다.
O. Jones

21
@OllieJones 두 번째도 좋다, OP는 OP가 데이터베이스를 생성하길 원한다고 가정하고있다
nawfal

3
모든 대문자가 왜 "INFORMATION_SCHEMA"입니까? 나와 함께 그것은 모두 소문자입니다
Hubro

3
* OK, 분명히 PHPMyAdmin은 모든 데이터베이스 이름을 소문자로 표시하며 쿼리는 어쨌든 둘 다를 사용하여 작동합니다
Hubro

1
@nawfal에 동의하십시오. DB를 만들고 싶지 않을 수도 있습니다.
SteveCinq

122

데이터베이스가 있는지 확인하는 간단한 방법은 다음과 같습니다.

SHOW DATABASES LIKE 'dbname';

이름이 'dbname'인 데이터베이스가 존재하지 않으면 빈 세트가 나타납니다. 존재하면 하나의 행을 얻습니다.


1
솔루션이 올바른 것으로 표시된 것보다 잘 작동했습니다. 감사합니다]
John williams

이 좋은 답변을 설명 공식적인 내용은 명령에 대한 공식 웹 사이트의 설명서 페이지로 이동 : dev.mysql.com/doc/refman/5.5/en/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 성가신 것처럼 보일 수 있지만 두 개의 스레드가 동시에 동일한 데이터베이스를 작성하려고 시도하고 실패하면 어떻게 될지 상상하십시오. 데이터베이스를 작성하기 전에 데이터베이스가 존재하는지 판별하는 데 유용하지 않지만 여러 스레드가 데이터베이스를 작성하려고 시도하는 동안 충돌을 방지하는 데 유용합니다.
Brogan

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

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
이것은 실제로 작동하지 않습니다 ... 대신 다음과 같이 시도하십시오 :`result = $ (mysql -s -N -e "Information_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'db'"에서 SCHEMA_NAME 선택) ;; [-z "$ result"] 인 경우; 그런 다음 echo "db 존재하지 않습니다"; fi
Steven Green

1
@StevenGreen의 적응은 잘 작동하므로 bash / sql 조각에 +1입니다.
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결과가 항상 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";
}

그것이 제가 항상 사용하는 방법입니다.



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

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

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

긴 바람과 뒤얽힌 (그러나 나와 함께하십시오!), 여기에 DB가 있는지 확인하고 필요한 테이블을 만들기 위해 만든 클래스 시스템이 있습니다.

<?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 도구와 함께 Visual Studio를 사용하지 않는 경우 지역에 대해 걱정하지 마십시오.


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

나는 단순히 다음 쿼리를 사용하고 있습니다 :

"USE 'DBname'"

그런 다음 결과가 FALSE인지 확인하십시오. 그렇지 않으면 액세스 거부 오류가있을 수 있지만 알 수 없습니다. 따라서 권한이 관련된 경우 다음을 사용할 수 있습니다.

"SHOW DATABASES LIKE 'DBname'"

앞에서 이미 언급했듯이


1

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

다음 해결책이 나를 위해 일했습니다.

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

0

PDO가있는 또 다른 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는 모든 데이터베이스를 리턴하지 않지만 빈 세트를 리턴합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.