如何从外键中删除三个表?

时间:2010-03-02 14:44:57

标签: sql sql-server sql-server-2005 cascading-deletes

我希望能够选择一个groupID并通过MS SQL Server数据库中的三个表进行级联删除。表格如下所示:

table 1 - GROUP
-------------------------------------------
groupID | description | etc


table 2 - MEMBER
-------------------------------------------
memberID | name | etc


table 3 - MAPPINGTABLE 
-------------------------------------------
mappingID | groupID | memberID

我在想,因为我知道groupID,所以我可以根据groupID从映射表中选择memberID,并从成员表中删除它们,但我通常会得到一个错误:

“DELETE语句与REFERENCE约束冲突... [表格中的FK约束]”。

是否有人能够就从这三个方面删除的最佳方式给我一些指导 这些表同时出现?

感谢。

5 个答案:

答案 0 :(得分:5)

您正在遇到参照完整性。不用担心,RI是你的朋友。它是为了保护你。

根据您的结构,如果您尝试删除的行在中有相应的行,则无法从成员表中删除MappingTable 即可。

如果系统允许您这样做,那么您将在MappingTable中拥有孤立数据,而不会在成员或组表中显示相应的数据。数据库阻止您删除数据,因为已使用外键约束对数据放置了参照完整性约束。

ON DELETE CASCADE之类的选项,但它们可能非常致命,并且可能导致大量数据丢失。我个人从不实施级联删除。

您应首先从 MappingTable 中删除行,然后从查找表(成员,组)中删除任何数据

话虽如此,我必须说以下内容:

  1. 在删除数据之前进行备份(并确保您拥有有效的备份)。
  2. 创建另一个备份原因数据一旦删除就永远消失。
  3. 与业务/中小企业核实,通过删除数据来验证您做了正确的事情

答案 1 :(得分:3)

你需要按照自己的方式备份表格,所以从最底层开始,然后从表3中删除,再回到表1。

答案 2 :(得分:1)

要使用级联删除,您必须在外键中指定删除规则。 “ON DELETE CASCADE”选项就是您所需要的。

见这个例子

CREATE TABLE table_child
(
fieldkeyparent int,
field1 INT,
FOREIGN KEY ([fieldkeyparent]) REFERENCES Table_parent
ON DELETE CASCADE)

检查SQL Server的此链接。 Cascading Referential Integrity Constraints

答案 3 :(得分:0)

级联删除在不同的SQL服务器中实现不同。你在为服务器软件使用什么?

在oracle中,您可以在创建表时指定级联删除,以便在删除主记录时自动从其他表中删除数据。这是一个例子:

ALTER TABLE MAPPINGTABLE ADD CONSTRAINT FK_GROUPID
    FOREIGN KEY (groupID) REFERENCES GROUP(groupID)
ON DELETE CASCADE
;

答案 4 :(得分:0)

最简单的方法是在设置外键时,将其设置为ON DELETE CASCADE

ALTER TABLE mappingtable ADD CONSTRAINT fk_group_id FOREIGN KEY(groupID) REFERENCES group(groupID) ON DELETE CASCADE

另一个选项是ON UPDATE CASCADE,如果你想添加它,但在这里没有帮助。

这样做是因为当您从GROUP删除父级时,它会自动删除表MAPPINGTABLE中对它的任何引用

要从用户中删除,您还需要执行第二次删除语句。