2017-06-04 72 views
0

我有表如下:SQL唯一键IFF不会被删除

+----------+---------+ 
| ParentId | ChildId | 
+----------+---------+ 

这是目前一个一对多的关系(父母一方,多子女)主键是孩子的ID,因为孩子只能映射到一个父母(迄今为止都很简单)。
我的问题来自于现在尽管我想添加如下辅助柱:

+----------+---------+---------+ 
| ParentId | ChildId | Deleted | 
+----------+---------+---------+ 

因此,情况是我需要跟踪,审计原因,删除了父母的映射,我的想法是让儿童Id唯一iff 删除是错误的。问题是我如何实现这一目标?是否可以或者应该创建一个辅助表格来存档已删除的条目,其他任何建议我如何能够实现这个目标或我可以采取的另一种方法?

回答

1

我觉得这是你的问题:

我的想法是让子ID唯一当且仅当删除是非常错误的。 问题是我如何做到这一点?

如果是这样,你可以使用筛选唯一索引:

create unique index unq_t_parent_child on t(parent, child) 
    where isdeleted = 0; 
+0

我有看到这些类型的索引的我周围的问题是什么是使用这些对性能的影响,请注意我不期望写很多,但可能有很多读取。 – Heinrich

+0

@海因里希。 。 。这就是你如何让数据库执行你所要求的约束。这样的索引有一些开销,就像任何其他索引一样。这可能是实施这种约束的最便宜的方式。 –