检查表是否存在后从表中删除

Delete from a table after checking if it exists

提问人:Zaper127 提问时间:2/21/2017 最后编辑:Zaper127 更新时间:11/18/2023 访问量:21322

问:

在SQL中删除一行之前,我需要检查表是否存在。我在互联网上尝试了几件事,这似乎是出现的最多,但它不起作用。

IF OBJECT_ID('mytable', 'N') IS NOT NULL
BEGIN
    DELETE FROM table WHERE user_id= :user_id
END

我收到错误:

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF OBJECT_ID('we_image_gallery', 'U') IS NOT NULL DELETE FROM mytable' at line 1 

我需要一个仅使用当前数据库的解决方案,并且当脚本移植到多个系统时,我可以指望。

编辑:此查询由 PHP PDO 运行。似乎没有一个答案有效,是否有可能我的 pdo 或 sql 服务器中有一个设置导致了这个问题?

MySQL 数据库

评论

2赞 Strawberry 2/21/2017
这种问题是设计不佳的症状
0赞 Zaper127 2/21/2017
这实际上提出了另一个问题。制作一个额外的表来存储已创建的表(通过在不同的景点上安装不同的附加组件组合)并使用它来检查表,还是继续使用我当前的系统来检查表使用 sql 语句。
1赞 Strawberry 2/21/2017
你现在的系统很糟糕,但你提出的替代方案同样糟糕。您应该知道数据库中存在哪些表;这不应该是一个猜测的问题。
0赞 Zaper127 2/21/2017
只有当加载文件已上传但未运行设置时,这才会成为问题。我知道安装了什么,但我不能指望我系统的其他用户不这样做。所以我只是想得到一个安全网。
0赞 Strawberry 2/21/2017
只需修复您的设计;无论如何,这就是我会做的

答:

0赞 Mansoor 2/21/2017 #1
Using Exists statement to delete data from table:

IF EXISTS(SELECT 1 FROM Your_table WHERE user_id = user_id)
BEGIN
   DELETE FROM Your_table WHERE user_id= user_id
END

Delete table from database :

IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA =    
    'TheSchema' AND  TABLE_NAME = 'TheTable')
BEGIN
    --Your delete statement
END   
0赞 Pranav_Systematix 2/21/2017 #2

您可以INFORMATION_SCHEMA办理入住手续。通过where 子句中提供表名来为任何表提供 TABLES,如果该表存在,则可以执行所需的操作,如下所示:

IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES 
       WHERE TABLE_NAME = N'tbl_User')
BEGIN
--If table exist you can perform your operation here
--  DELETE FROM table WHERE user_id= :user_id
 Print 'Table Exists'

END
0赞 Bill Karwin 2/22/2017 #3

MySQL 不支持动态 SQL 解析器中的语句。只能在存储例程或触发器的主体中使用此类流控制语句IF

我在这里建议两种策略之一。一种选择是简单地尝试像 DELETE 这样的语句,但检查错误。或者,如果已启用 PDO 异常,则捕获异常。

try {
    $pdo->exec("DELETE ...");
} catch (PDOException $e) {
    error_log("SQL statement on $mytable failed: ".$e->getMessage());
}

mytable 上的 SQL 语句失败:SQLSTATE[42S02]:找不到基表或视图:1146 表“test.mytable”不存在

另一种策略是查询该表,如果它存在/不存在,则执行某些操作。

try {
        $stmt = $pdo->query("SHOW TABLES LIKE 'mytable'");
        if (!$stmt->fetchColumn()) {
                error_log("No such table 'mytable'");
        }
} catch (PDOException $e) {
        echo "SQL statement failed: " . $e->getMessage() . "\n";
}