2010-03-02 68 views
3

我希望能够选择一个groupID并通过MS SQL服务器数据库中的三个表进行级联删除。这些表如下所示:如何从三个带有外键的表中删除?

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


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


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

我在想,既然我知道了组ID,我大概可以基于断组ID的映射表中选择MEMBERID的,并删除那些从成员表中,但我通常最终会出现以下错误:

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

任何人都可以给我一些关于从这两个表中同时删除这三个表的最好方法的一些指导吗?

谢谢。

+1

你用什么数据库? – RRUZ 2010-03-02 14:48:43

+0

对不起。 MS SQL server 2005. – Chris 2010-03-02 14:54:40

回答

5

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

根据您的结构,你不能从会员集团表中删除,如果您正试图删除的行有MappingTable对应的行。

如果系统允许你这样做,那么在成员或组表中没有相应数据的情况下,MappingTable中会有孤立数据。数据库正在阻止您删除数据,因为已使用外键约束在数据上放置了参照完整性约束。

有像ON DELETE CASCADE这样的选项,但它们可能非常致命,可能会导致大量数据丢失。我个人从未实现级联删除。

你应该首先从MappingTable删除行,然后删除查找表(成员,集团)

话虽如此,我必须说,以下任何数据:

  1. 制作备份(并确保您拥有有效的备份),然后再删除它们。
  2. 做一次删除的另一个备份原因数据永远消失了。
  3. 检查与业务/ SME来验证你正在做正确的事情通过消除数据
+0

同意我也从不使用级联删除,因为如果有人删除大批记录,它可能会导致严重的性能问题。 – HLGEM 2010-03-02 14:59:04

+0

数据可以安全地删除,这是所有临时工作的东西,直到用户实际保存到其他表。 – Chris 2010-03-02 15:03:21

+0

谢谢!今天早上有一些讨论让我们拭目以待。我使用了一个临时表来保存成员标识符,而我从映射表中删除,然后在映射行消失后从其他两个表中删除。 – Chris 2010-03-02 15:25:14

3

你需要你的工作方式备份的表,所以在最底层开始,然后从表中删除3回到表1.

0

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

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

ALTER TABLE MAPPINGTABLE ADD CONSTRAINT FK_GROUPID 
    FOREIGN KEY (groupID) REFERENCES GROUP(groupID) 
ON DELETE CASCADE 
; 
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

要从用户删除,以及,你需要做的第二删除声明。

+0

必须非常小心使用级联删除...我从来没有使用过他们自己出于恐惧。 – 2010-03-02 14:57:20

+0

级联删除是你的朋友。 – 2010-03-02 15:04:30

+0

'ON DELETE CASCADE'就像火 - 一种可以大有裨益或极具伤害的工具。 Oracle的'DELETE CASCADE'的实现在功能上是一个嵌套循环删除(它为每行发出一个'DELETE FROM CHILD_TABLE WHERE KEY_VALUE =:parent_key'),并且在某些情况下,您最好使用DELETE FROM CHILD_TABLE WHERE KEY_VALUE IN(SELECT PARENT_KEY FROM PARENT WHERE DELETE_CONDITION IS TRUE)''。 – 2010-03-02 15:08:09

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

+0

感谢您的想法。你的创建表为我提供了创建临时表来保存一些值的想法,而我从其他表中删除。 – Chris 2010-03-02 15:22:50