创建复合键

时间:2016-11-23 10:16:37

标签: sql-server tsql composite-key

我有一张表:

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

3 个答案:

答案 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

https://msdn.microsoft.com/en-us/library/ms188783.aspx