我需要进行SQL查询的帮助,当我删除主要类别时,它应该删除我的子类别的所有数据以及与该子类别相关的所有产品。基本上从3个表中删除数据。
可以在一个查询中完成吗?
答案 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:2003,MySSQL,Oracle,PostgreSQL,MS SQL Server,SQLite
那样,当您从主表中删除时。然后,另一个表中引用这些已删除记录的记录也将被自动删除。
例如在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 NULL
或ON DELETE SET DEFAULT n
,甚至使用触发器。当然,那以后需要对未引用的记录进行额外的清理,例如通过预定的脚本。但这感觉并不那么有害。因为这样,当有人意外删除了本不应删除的MainCategory时,更容易修复。