我希望能够选择一个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约束]”。
是否有人能够就从这三个方面删除的最佳方式给我一些指导 这些表同时出现?
感谢。
答案 0 :(得分:5)
您正在遇到参照完整性。不用担心,RI是你的朋友。它是为了保护你。
根据您的结构,如果您尝试删除的行在中有相应的行,则无法从成员或组表中删除MappingTable 即可。
如果系统允许您这样做,那么您将在MappingTable中拥有孤立数据,而不会在成员或组表中显示相应的数据。数据库阻止您删除数据,因为已使用外键约束对数据放置了参照完整性约束。
有ON DELETE CASCADE
之类的选项,但它们可能非常致命,并且可能导致大量数据丢失。我个人从不实施级联删除。
您应首先从 MappingTable 中删除行,然后从查找表(成员,组)中删除任何数据
话虽如此,我必须说以下内容:
答案 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
中对它的任何引用
要从用户中删除,您还需要执行第二次删除语句。