MySQL 检查表是否存在而不抛出异常

问题描述 投票:0回答:11

检查 MySQL 中是否存在表(最好通过 PHP 中的 PDO)而不引发异常的最佳方法是什么。我不想解析“SHOW TABLES LIKE”等的结果。一定有某种布尔查询?

php mysql pdo database
11个回答
202
投票

使用准备好的语句查询 information_schema 数据库看起来是最可靠、最安全的解决方案。

$sql = "SELECT 1 FROM information_schema.tables 
        WHERE table_schema = database() AND table_name = ?";
$stmt =  $pdo->prepare($sql);
$stmt->execute([$tableName]);
$exists = (bool)$stmt->fetchColumn();

40
投票

如果您使用的是 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/


8
投票

使用 mysqli 我创建了以下函数。假设你有一个名为 $con 的 mysqli 实例。

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

希望有帮助。

警告: 正如 @jcaron 所建议的,此函数可能容易受到 SQLinjection 攻击,因此请确保您的

$table
var 是干净的,或者更好地使用参数化查询。


3
投票

如果有人来寻找这个问题,就会发布此信息。尽管已经回答了一点。有些回复使它变得比需要的更复杂。

对于 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 条件推入 or 即可。为了满足我的需要,我只需要死。虽然你可以设置或其他东西。有些人可能更喜欢 if/else if/else。然后删除 or 然后提供 if/else if/else。


2
投票

这是我在使用存储过程时更喜欢的解决方案。自定义 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”并检查结果是否为真/假

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

0
投票

问题

CALL sys.table_exists(...

您将需要高权限,并且使用其他选项(如标题所示)可能会启动警报/警告/错误

因此,在连接到目标数据库之后,您可以运行:

$db = 'database';
$Q = "SHOW TABLES WHERE `Tables_in_{$db}` LIKE 'the_table';";

这个查询最好的是:

  1. 非常简单
  2. 零警告(如果表不存在)
  3. 零错误(如果表不存在)

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

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

    }

-1
投票

如果想要这样做的原因是创建条件表,那么“CREATE TABLE IF NOT EXISTS”似乎是这项工作的理想选择。在我发现这一点之前,我使用了上面的“描述”方法。更多信息请参见:MySQL“如果不存在则创建表”-> 错误 1050


-9
投票

为什么你说得这么难理解?

function table_exist($table){ 
    $pTableExist = mysql_query("show tables like '".$table."'");
    if ($rTableExist = mysql_fetch_array($pTableExist)) {
        return "Yes";
    }else{
        return "No";
    }
} 
© www.soinside.com 2019 - 2024. All rights reserved.