从SQL中的多个表中删除多行数据

时间:2018-09-08 04:26:06

标签: sql

我需要进行SQL查询的帮助,当我删除主要类别时,它应该删除我的子类别的所有数据以及与该子类别相关的所有产品。基本上从3个表中删除数据。

可以在一个查询中完成吗?

2 个答案:

答案 0 :(得分:0)

Cant给您没有数据库参考的代码示例。但是,如果所有表都具有相同的主键,则可以尝试使用INNER JOIN

DELETE table1, table2, table3
FROM table1
INNER JOIN table2 ON table2.key = table1.key
INNER JOIN table3 ON table3.key = table1.key
WHERE table1.key = value;

键值应在所有表中通用。类似于“ ID”。

答案 1 :(得分:0)

您可以使用启用了ON DELETE CASCADE设置的外键来代替通过Sql来解决问题。

如果数据库类型/版本支持它。
F.e. ANSI SQL:2003MySSQLOraclePostgreSQLMS SQL ServerSQLite

那样,当您从主表中删除时。然后,另一个表中引用这些已删除记录的记录也将被自动删除。

例如在MS Sql Server中:

ALTER TABLE SubCategory
ADD CONSTRAINT FK_SubCategory_MainCategoryID_Cascade
FOREIGN KEY (MainCategoryID)
REFERENCES MainCategory(ID) ON DELETE CASCADE;

ALTER TABLE Products
ADD CONSTRAINT FK_Products_SubCategoryID_Cascade
FOREIGN KEY (SubCategoryID)
REFERENCES SubCategory(ID) ON DELETE CASCADE;

这是一种自动维护它们之间引用完整性的方法。

此后,从MainCategory表中删除将从SubCategory表中删除相关记录。以及与已删除的子类别记录相关的产品。

here是SQLite演示的 db <> fiddle 示例。

P.S。我个人更喜欢使用ON DELETE SET NULLON DELETE SET DEFAULT n,甚至使用触发器。当然,那以后需要对未引用的记录进行额外的清理,例如通过预定的脚本。但这感觉并不那么有害。因为这样,当有人意外删除了本不应删除的MainCategory时,更容易修复。