每组中只有一个记录被标记为主要记录的约束

时间:2018-08-06 17:51:49

标签: sql-server constraints

如何在表上设置约束以强制将每个组中的一个记录恰好标记为“主要”。

例如在提供冒险运动的公司的数据库中,他们具有表Customer和表EmergencyContact,其中从EmergencyContact到Customer存在FK约束。每个客户记录可能有零个或多个紧急联系人记录。如果客户有一个或多个紧急联系人,则其中的必须必须标记为主要联系人。如果只有一个紧急联系人,那么显然那是必须标记为主要联系人的那个联系人。

请注意,相关约束很容易实现,并且可能是解决方案的一部分-强制将每个客户不超过个紧急联系人标记为主要联系人。关于stackoverflow的问题已经很多(例如很好的答案),例如herehere等。但是,我没有找到答案(或其他方法)来强制每个组标记至少一个个子记录,其中子记录存在。

如果可能的话,我想避免在计算列中使用触发器或基于UDF的约束。触发器可能会被禁用,并且不会总是触发(请参阅Alex Kuznetsov优秀著作Defensive Database Programming的第208页),并且在某些情况下,包裹在检查约束中的UDF也会被绕过或忽略(请参阅第184页起)同一本书)。

我已经尝试了多种方法来解决该问题,例如索引视图以及从父表到子表的FK约束,但都没有成功。

1 个答案:

答案 0 :(得分:2)

我个人处理此问题的方式是使用CHECK约束。

如果必须避免CHECK约束和触发器,那么下一个最佳选择是在表上设置权限,以使临时的INSERT和UPDATE被拒绝,并且更改表中数据的唯一方法是通过存储过程。然后将您描述的逻辑放入存储过程代码中。

您不会找到使用索引或外键执行此操作的方法。