我有一张表:
Id PersonId Phone IsPrimary
-----------------------------------
1 1 12345 1
2 1 55555 0
3 2 66666 1
4 3 77777 1
5 3 88888 0
6 3 99999 0
如何创建约束,允许在每个PersonId中只插入一个IsPrimary = 1。对于所有PersonId,只有一个IsPrimary = 1.因此,在结果中我无法插入下一条记录:
Id PersonId Phone IsPrimary
-----------------------------------
1 1 00000 1
答案 0 :(得分:9)
您可以尝试创建唯一的过滤索引:
<ChannelFactory<ISchedulerWcfService>>
答案 1 :(得分:4)
您尝试使用数据而不是实际关系在两个实体之间创建关系。每个人都有一个主要电话号码和多个非主要电话号码。而不是使用数据(在您的情况下,IsPrimary
列)描述主要电话号码关系,而应该是Persons表中的外键:
Persons table
=============
PersonId Name PrimaryPhoneId
-----------------------------------
1 Alice 1
2 Bob 3
3 Charlie 4
Phones table
============
Id PersonId Phone
---------------------
1 1 12345
2 1 55555
3 2 66666
4 3 77777
5 3 88888
6 3 99999
这样一个人只能拥有一部主电话。此外,如果有人切换了他们的主要电话号码,您只需要更新一行。如果您持有IsPrimary
列,则必须更新两行(将旧主数据库设置为0,然后将新主数据库设置为1),并确保两次更新都发生在同一事务中,否则如果第二行无法更新,您可能会完全丢失主数据。
答案 2 :(得分:2)
过滤索引!
CREATE UNIQUE NONCLUSTERED INDEX uniquey_thingumyjig
ON table_name (PersonId)
WHERE IsPrimary = 1