【问题标题】:Unable to delete from multiple tables无法从多个表中删除
【发布时间】:2014-08-02 17:16:22
【问题描述】:

我正在尝试删除我通过管理员帐户创建的网站中某个人的所有记录。查询如下:

DELETE FROM users u, user_address ua, pending_order po, product_catalogue pc 
WHERE u.user_id = ua.user_id 
AND ua.user_id = po.user_id 
AND po.user_id = pc.user_id 
AND u.user_id = '$user_id'

$user_id 是从表单中的$_POST['user_id'] 获得的。

我每次运行时都会收到此错误

您的 SQL 语法有错误;检查手册 对应于您的 MySQL 服务器版本,以便使用正确的语法 靠近 'u, user_address ua, pending_order po, product_catalogue pc WHERE u.user_id = ua。'在第 1 行

这里有什么问题?

【问题讨论】:

  • 不能在一个语句中从多个表中删除stackoverflow.com/questions/17539145/…
  • 使用多个语句将它们放在一个事务中。
  • 除非您使用 ON DELETE CASCADE 设置了外键,否则您一次只能从一个表中删除

标签: mysql sql


【解决方案1】:

您必须为每个表运行一个删除语句:

delete from users where user_id = '$user_id';
delete from user_addresses where user_id = '$user_id';
delete from pending_order where user_id = '$user_id';
delete from product_catalogue where user_id = '$user_id';

【讨论】:

    【解决方案2】:

    你必须从表中一一删除:

    DELETE FROM users  WHERE user_id = '$user_id';
    DELETE FROM user_address WHERE user_id = '$user_id';
    DELETE FROM  pending_order WHERE user_id = '$user_id';
    DELETE FROM product_catalogue WHERE user_id = '$user_id'; 
    

    如果您使用大型表和 MySQL 复制,有时会更好(测试一下!):

    $rows =  SELECT group_concat(id) FROM product_catalogue WHERE user id = ...
    //$rows  = 1,2,3,4,5,10,15,155 or similar list)
    DELETE FROM table WHERE id in ( $rows )
    

    当删除的项目列表很大并且我想尽量减少锁定和复制延迟时,我会这样做。

    【讨论】:

      【解决方案3】:

      正如documentation 建议的那样...... :)

      DELETE FROM users u, user_address ua, pending_order po, product_catalogue pc 
      using u inner join ua inner join po inner join pc
      WHERE u.user_id = ua.user_id 
      AND ua.user_id = po.user_id 
      AND po.user_id = pc.user_id 
      AND u.user_id = '$user_id';
      

      注意:从四个表中分别删除相应的行(如果需要,在一个事务中)可能会更省时。特别是如果不是所有这些 user_id 是一个索引字段。

      【讨论】:

        【解决方案4】:

        你不能用一个语句删除多个表delete语句..你需要单独做。就像

        DELETE FROM users  WHERE user_id = '$user_id';
        DELETE FROM user_address WHERE user_id = '$user_id';
        DELETE FROM  pending_order WHERE user_id = '$user_id';
        DELETE FROM product_catalogue WHERE user_id = '$user_id'; 
        

        【讨论】:

          【解决方案5】:

          您可以按照上面的建议运行以下命令

          DELETE FROM users  WHERE user_id = '$user_id';
          DELETE FROM user_address WHERE user_id = '$user_id';
          DELETE FROM  pending_order WHERE user_id = '$user_id';
          DELETE FROM product_catalogue WHERE user_id = '$user_id';
          

          一个。但是你为什么不设置外键关系,以达到你想要的结果。

          您必须在 users 表和其他表中创建 user_id 作为主键 user_address、pending_order、product_catalogue 将它们声明为外键 并通过添加 ON DELETE CASCADE 相应地修改您的查询,这将删除与子表中传递的 $user_id 关联的所有记录。

          b.您还可以设置 MySQL 触发器,只需 google 即可了解触发器的详细信息。

          c。不过我有不同的建议。

          为什么不在你的表中添加一个名为 active_status 的新列并将记录的状态存储为 Active Inactive,而不是删除记录,你只需更改记录的状态,你可以将其称为软删除,在更新级联等表中使用相同的 pk 和 fk 概念。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-02-26
            • 2010-10-22
            • 2012-01-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多