MySQL은 예외를 던지지 않고 테이블이 있는지 확인합니다.


123

예외를 throw하지 않고 MySQL에 테이블이 있는지 확인하는 가장 좋은 방법은 무엇입니까 (PHP의 PDO를 통해). "SHOW TABLES LIKE"등의 결과를 구문 분석하고 싶지 않습니다. 일종의 부울 쿼리가 있어야합니까?

답변:


199

나는 그것에 대한 PDO 구문을 모르지만 이것은 매우 간단합니다.

$result = mysql_query("SHOW TABLES LIKE 'myTable'");
$tableExists = mysql_num_rows($result) > 0;

감사합니다. SHOW TABLES LIKE가 하나의 정확한 테이블로만 제한 될 수 있다는 사실을 완전히 잊었습니다.
clops

53
PDO : $ tableExists = $ db-> query ( "SHOW TABLES LIKE 'myTable'")-> rowCount ()> 0;
Reactgular dec

4
mysqli : if ($ db-> query ( "SHOW TABLES LIKE 'myTable'")-> num_rows == 0) {// create table}
zPuls3

1
이 경우 @MathewFoscarini, rowCount ()는 신뢰할 수 없습니다 . PHP doc를 참조하십시오 .
datasn.io apr

4
없습니다 더 이상 지원 을위한 mysql_*기능, 그들은되어 공식적으로 사용되지 않는 , 더 이상 유지 될 것입니다 제거 미래에. 향후 프로젝트의 기능을 보장하려면 PDO 또는 MySQLi 로 코드를 업데이트해야합니다 .
TRiG

39

MySQL 5.0 이상을 사용하는 경우 다음을 시도해 볼 수 있습니다.

SELECT COUNT(*)
FROM information_schema.tables 
WHERE table_schema = '[database name]' 
AND table_name = '[table name]';

모든 결과는 테이블이 존재 함을 나타냅니다.

출처 : http://www.electrictoolbox.com/check-if-mysql-table-exists/


아마도 내가 뭔가를 놓치고 있지만 왜 SHOW TABLES 보다이 방법을 사용합니까?
nickf

1
@nickf ansi 표준의 일부이므로 서로 다른 rdbms간에 이식 할 수 있습니다.
troelskn

@nickf : MySQL 이외의 데이터베이스에서도 작동합니다. 여기에는 내가 말할 수있는 한 PostgreSQL과 SQL Server가 포함됩니다.
Powerlord 2010 년

이 ... 보안 당신이에 연결되지 않은 데이터베이스에서 정보를 조회 할 수 있습니다 악용하는 경우 궁금
Talvi Watia

3
보안 위험 없음-information_schema 데이터베이스에 대한 쿼리는 연결된 사용자에게 권한이있는 테이블 만 표시합니다.
Warren Rumak 2011 년

8

mysqli를 사용하여 다음 기능을 만들었습니다. $ con이라는 mysqli 인스턴스가 있다고 가정합니다.

function table_exist($table){
    global $con;
    $table = $con->real_escape_string($table);
    $sql = "show tables like '".$table."'";
    $res = $con->query($sql);
    return ($res->num_rows > 0);
}

도움이 되었기를 바랍니다.

경고 : @jcaron에 의해 요청 된대로이 함수는 sqlinjection attacs에 취약 할 수 있으므로 $tablevar가 깨끗한 지 확인 하거나 매개 변수화 된 쿼리를 더 잘 사용하십시오.


누군가가 $ table 변수를 채우도록 허용 한 경우에만 SQL 문 내의 모든 변수가 위험하지는 않습니다. 신뢰할 수없는 소스에서 데이터를 가져 오는 경우에만 가능합니다. 물론 함수를 사용하고 필터링을 수행하는 방법에 대한 책임은 귀하에게 있습니다. 이 답변에 반대 할 필요가 없습니다.
Falk

이와 같은 코드를 게시하면 누군가 데이터가 제대로 확인되지 않은 곳에서 사용하게되며 결국 SQL 주입으로 끝납니다. 매개 변수화 된 요청을 사용하기 만하면 데이터 확인 여부에 관계없이 문제를 방지 할 수 있습니다. 여기서 그렇게하지 않을 이유가 없습니다. 단지 나쁜 습관 일뿐입니다.
jcaron

real_escape_string을 추가하는 것은 어떻습니까?
Falk

매개 변수화 된 쿼리를 사용하고 공포 이야기를 피하십시오.
jcaron

4

이 질문을 찾는 사람이 오면 게시됩니다. 조금 대답했지만. 일부 답변은 필요 이상으로 복잡하게 만듭니다.

mysql *의 경우 다음을 사용했습니다.

if (mysqli_num_rows(
    mysqli_query(
                    $con,"SHOW TABLES LIKE '" . $table . "'")
                ) > 0
        or die ("No table set")
    ){

PDO에서는 다음을 사용했습니다.

if ($con->query(
                   "SHOW TABLES LIKE '" . $table . "'"
               )->rowCount() > 0
        or die("No table set")
   ){

이것으로 나는 else 조건을 또는 안으로 밀어 넣습니다. 그리고 내 필요를 위해서 나는 단지 죽기 만하면됩니다. 설정하거나 다른 일을 할 수 있지만. 일부는 if / else if / else를 선호 할 수 있습니다. 그런 다음 if / else if / else를 제거하거나 제공합니다.


3

저장 프로 시저를 사용할 때 선호하는 솔루션은 다음과 같습니다. 현재 데이터베이스에 테이블이 있는지 확인하기위한 사용자 정의 mysql 함수.

delimiter $$

CREATE FUNCTION TABLE_EXISTS(_table_name VARCHAR(45))
RETURNS BOOLEAN
DETERMINISTIC READS SQL DATA
BEGIN
    DECLARE _exists  TINYINT(1) DEFAULT 0;

    SELECT COUNT(*) INTO _exists
    FROM information_schema.tables 
    WHERE table_schema =  DATABASE()
    AND table_name =  _table_name;

    RETURN _exists;

END$$

SELECT TABLE_EXISTS('you_table_name') as _exists

2

"Show tables"는 더 큰 데이터베이스에서 느릴 수 있으므로 "DESCRIBE"를 사용하고 결과적으로 true / false가되는지 확인하는 것이 좋습니다.

$tableExists = mysqli_query("DESCRIBE `myTable`");

내가 읽은 내용에서 'SHOW'가 비효율적이면 'DESCRIBE'보다 'information_schema'가 더 선호됩니다.
Esoterica

-1
$q = "SHOW TABLES";
$res = mysql_query($q, $con);
if ($res)
while ( $row = mysql_fetch_array($res, MYSQL_ASSOC) )
{
    foreach( $row as $key => $value )
    {
        if ( $value = BTABLE )  // BTABLE IS A DEFINED NAME OF TABLE
            echo "exist";
        else
            echo "not exist";
    }
}

2
최상의 답변 품질을 제공하려면 코드에 대한 정확한 설명을 추가하십시오. 단순히 일부 코드를 붙여 넣는 것은 질문 작성자에게 많은 것을 알려주지 않습니다.
Jakub Matczak

5
이것은 실제로 끔찍합니다. 따라서 50,000 개의 테이블이있는 경우 모든 테이블을로드하고 각 테이블을 반복하여 올바른 테이블이 있는지 확인합니다.
Rohit Chopra

-1

Zend 프레임 워크

public function verifyTablesExists($tablesName)
    {
        $db = $this->getDefaultAdapter();
        $config_db = $db->getConfig();

        $sql = "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = '{$config_db['dbname']}'  AND table_name = '{$tablesName}'";

        $result = $db->fetchRow($sql);
        return $result;

    }


-9

왜 그렇게 이해하기 어렵게 만드나요?

function table_exist($table){ 
    $pTableExist = mysql_query("show tables like '".$table."'");
    if ($rTableExist = mysql_fetch_array($pTableExist)) {
        return "Yes";
    }else{
        return "No";
    }
} 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.