MySQL检查表是否存在而不会引发异常


123

检查表是否存在于MySQL中(最好通过PHP中的PDO)而不抛出异常的最佳方法是什么。我不喜欢解析“ SHOW TABLES LIKE”等的结果。必须有某种布尔查询吗?

Answers:


199

我不知道它的PDO语法,但这看起来很简单:

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

谢谢,完全忘记了SHOW TABLES LIKE可能只限于一张确切的桌子
阻塞了

53
PDO:$ tableExists = $ db-> query(“ SHOW TABLES LIKE'myTable'”)-> rowCount()> 0;
Reactgular 2012年

4
mysqli:if($ db-> query(“ SHOW TABLES LIKE'myTable'”)-> num_rows == 0){//创建表}
zPuls3

1
@MathewFoscarini,rowCount()在这种情况下可能不可靠,请参见PHP doc
datasn.io 2015年

4
没有更多的支持mysql_*功能,他们正式弃用不再保留,将被删除的未来。您应该使用PDOMySQLi更新代码,以确保将来项目的功能。
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

想知道这是否是一种安全漏洞,您可以从未连接的数据库中查询信息...
Talvi Watia 2010年

3
没有安全风险-对information_schema数据库的查询将仅显示已连接用户有权访问的表。
沃伦·鲁马克

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附件的攻击,因此请确保您的$tablevar是干净的,甚至更好地使用参数化查询。


仅当您让某人填充$ table var时,sql语句中的每个var才是危险的,仅当您从不受信任的来源获取数据时。当然,您要负责如何使用该功能以及如何进行过滤。无需对此答案投反对票。
福尔克(Falk)

如果您以这种方式发布代码,则最终有人会在未正确检查数据的地方使用它,并且最终会进行SQL注入。只需使用参数化的请求,无论数据是否经过检查,都将避免任何问题。这里没有任何理由不这样做,这只是不好的做法。
jcaron

如何添加real_escape_string?
福尔克(Falk)

使用参数化查询,避免出现恐怖故事。
jcaron '16

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

由于在较大的数据库上,“显示表”的速度可能较慢,因此我建议使用“ DESCRIBE”并检查结果是否为true / false

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

根据我的阅读,如果“ SHOW”变得效率低下,则“ information_schema”比“ DESCRIBE”更可取。
Esoterica'7

-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 2013年

5
这实际上是可怕的。因此,如果有50,000个表,您将加载所有表,循环遍历每个表以查找是否存在正确的表?
罗希特·乔普拉

-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";
    }
} 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.