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

从SQL中的多个表中删除多行数据,sql,Sql,我需要帮助进行SQL查询,当我删除主类别时,它应该删除我的子类别的所有数据以及与该子类别相关的所有产品。基本上是从3个表中删除数据 它可以在一个查询中完成吗?如果没有数据库引用,就无法提供代码示例。但是,如果所有表都具有相同的主键,则可以尝试使用内部联接 DELETE table1, table2, table3 FROM table1 INNER JOIN table2 ON table2.key = table1.key INNER JOIN table3 ON table3.key = t

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


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

如果没有数据库引用,就无法提供代码示例。但是,如果所有表都具有相同的主键,则可以尝试使用
内部联接

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”的东西。

您可以使用启用了“删除级联”设置的外键,而不是通过Sql解决它

如果您的数据库类型/版本支持它。
F.e

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

例如,在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表中删除相关记录。以及与已删除的子类别记录相关的产品

这是SQLite要演示的dbfiddle示例


另外,就我个人而言,我更喜欢在DELETE SET NULL上使用
,或者在DELETE SET DEFAULT n上使用
,甚至使用触发器。当然,这需要在事后对未引用的记录进行额外的清理,例如通过预定的脚本。但它只是感觉不那么有害。因为这样一来,如果有人意外删除了本不该删除的主类别,则更容易修复

请先看一看您需要查看级联删除外键定义。这在很大程度上取决于您正在使用的实际、具体的RDBMS。。。。。请添加一个相关标签,以明确这一点!这是无效的标准SQL。您应该提到您的解决方案适用于哪个DBMS