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

时间:2017-02-21 04:39:19

标签: mysql sql

我需要检查一个表是否存在,然后再从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服务器中是否有可能导致问题的设置?

3 个答案:

答案 0 :(得分:0)

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   

答案 1 :(得分:0)

您可以通过在 where子句中提供表名来检查任何表的 INFORMATION_SCHEMA.TABLES ,如果该表存在,则可以执行以下所需的操作:< / p>

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

答案 2 :(得分:0)

MySQL在动态SQL解析器中不支持IF语句。您只能在存储的例程或触发器的主体中使用flow-control statements

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

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

mytable上的SQL语句失败:SQLSTATE [42S02]:未找到基表或视图:1146表&#39; test.mytable&#39;不存在

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

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