当子表不在父表中时,创建一个从子表中删除任何记录的过程

时间:2016-05-09 19:05:04

标签: sql sql-server

当我从我们的应用程序中删除记录时,它会在某些表中保留一些记录,我正在寻找帮助,以便弄清楚如何创建一个删除子表中记录的过程已从父表中清除?

2 个答案:

答案 0 :(得分:0)

一般来说,您的问题的答案称为存在量化。在SQL中,它具有以下形式:

delete from C where not exists (
    select 1 from P 
    where P.child_key = C.key
)

然而,你不应该进入那个位置:不应该是孩子没有父母的情况。子表应该有一个声明要求存在父键的外键。这样,要插入子项的父项,并且在引用它的子项存在时不能删除父项

在存在此类外键约束的情况下,唯一允许的事件顺序是删除父级中的子级where exists键,然后删除父级。为了正确,这两个语句应该是事务的一部分。

有些评论建议使用声明性参照完整性(DRI)来删除子行。我不是粉丝;我使用DRI作为约束形式来创建规则。对于数据的操作,我建议使用显式代码,在应用程序级别可以更轻松地处理意外情况。

答案 1 :(得分:0)

它发生在组织严密的数据库中,因此您需要清理数据。

delete childTable where FK_field not in (
select PK_field from parentTable)

为了避免将来在你的childTable中创建FK约束这个问题。