无法从多个表中删除

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 概念。

【讨论】:

以上是关于无法从多个表中删除的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 vba 从具有多个数据字段的 excel 数据透视表中删除小计

无法从 Netezza 表中删除重复数据

无法从表中删除项目(Lua)

Codeigniter 无法使用连接方法从数据库表中删除行

无法在 Excel 崩溃的情况下从工作表中删除命令按钮

无法从 Rails 4 和 PSQL 9.3 中的表中删除索引