无法从多个表中删除
Posted
技术标签:
【中文标题】无法从多个表中删除【英文标题】: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 行
这里有什么问题?
【问题讨论】:
不能在一个语句中从多个表中删除***.com/questions/17539145/… 使用多个语句将它们放在一个事务中。 除非您使用 ON DELETE CASCADE 设置了外键,否则您一次只能从一个表中删除 【参考方案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 概念。
【讨论】:
以上是关于无法从多个表中删除的主要内容,如果未能解决你的问题,请参考以下文章