唯一子行的SQL约束

时间:2014-06-10 16:39:21

标签: sql sql-server sql-server-2008 tsql

我有一个父表人。 3个子表PersonA,PersonB和PersonC。

Person - ID int primary key not null, name varchar(50) null
PersonA - ID int primary key not null references Person(ID), fname, lname, zip etc.
PersonB - ID int primary key not null references Person(ID), fname, lname, zip etc.
PersonC - ID int primary key not null references Person(ID), fname, lname, zip etc.

我需要建立的是一种限制,以确保一个人只属于三个人中的一个。例如,如果我在Person中有234行,JohnSmith使用我当前的设计,我可以在PersonA,PersonB和PersonC中拥有相同的234。我的目标是将234只放在三个chilt桌子中的一个。

3 个答案:

答案 0 :(得分:1)

处理此问题的一种方法是在Person表中使用三个带有约束的外键引用:

PersonAID int references PersonA(ID),
PersonBID int references PersonB(ID),
PersonCID int references PersonC(ID),
check ((PersonAID is not null and PersonBID is null and PersonCID is null) or
       (PersonBID is not null and PersonCID is null and PersonAID is null) or
       (PersonCID is not null and PersonAID is null and PersonBID is null)
      )

注意:如果您想允许所有三个NULL

check ((PersonAID is not null and PersonBID is null and PersonCID is null) or
       (PersonBID is not null and PersonCID is null and PersonAID is null) or
       (PersonCID is not null and PersonAID is null and PersonBID is null) or
       (PersonAID is null and PersonBID is null and PersonCID is null)
      )

如果你这样做,那么你可能不需要从每个子表到维护人员的引用。

答案 1 :(得分:0)

您可以使用插入触发器添加约束,因此当插入行时检查没有其他表具有相同的行ID。或者,创建一个映射表,该表已引用具有主id的主人员表和引用子表的id的另一列Id。在主表id上设置主键。

答案 2 :(得分:0)

您是否尝试过创建三个子表的并集视图,然后在此视图上创建唯一索引?查看MSDN

Create View Persons
as

Select ID From PersonA    
union    
Select ID From PersonB    
union    
Select ID From PersonC


--Create an index on the view.
CREATE UNIQUE CLUSTERED INDEX IDX_V1 
    ON Persons (ID);