3

我希望能够选择一个 groupID 并通过在 MS SQL 服务器数据库中找到的三个表进行级联删除。这些表如下所示:

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


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


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

我在想,既然我知道 groupID,我可能会根据 groupID 从映射表中选择 memberID 并从 member 表中删除它们,但我通常会遇到以下错误:

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

谁能给我一些关于同时从所有这三个表中删除的最佳方法的指导?

谢谢。

4

5 回答 5

5

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

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

如果系统允许您这样做,您将在 MappingTable 中有孤立数据,而在 Member 或 Group 表中没有相应的数据。数据库阻止您删除数据,因为已使用外键约束在数据上放置了参照完整性约束。

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

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

话虽如此,我必须说以下几点:

  1. 在删除数据之前对其进行备份(并确保您拥有有效的备份)。
  2. 进行另一个备份,因为一旦删除,数据就永远消失了。
  3. 与业务/中小企业核实,通过删除数据来验证您是否在做正确的事情
于 2010-03-02T14:49:32.580 回答
3

您需要按自己的方式备份表,因此从最底部开始,然后从表 3 中删除,然后返回表 1。

于 2010-03-02T14:51:21.747 回答
1

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

看这个例子

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

检查此链接以获取 SQL Server。 级联参照完整性约束

于 2010-03-02T14:57:14.433 回答
0

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

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

ALTER TABLE MAPPINGTABLE ADD CONSTRAINT FK_GROUPID
    FOREIGN KEY (groupID) REFERENCES GROUP(groupID)
ON DELETE CASCADE
;
于 2010-03-02T14:51:23.400 回答
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

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

于 2010-03-02T14:52:46.113 回答