创建复合键

Create a composite key

我有一个table喜欢:

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 到此 table。对于所有 PersonId,应该只有一个 IsPrimary = 1。因此,结果我将无法插入下一条记录:

  Id   PersonId     Phone   IsPrimary
  -----------------------------------
  1     1          00000        1

您可以尝试创建一个唯一的过滤索引:

CREATE UNIQUE INDEX UQ_Person_isPrimary
ON Person (PersonId, IsPrimary)
WHERE IsPrimary = 1

过滤索引!

CREATE UNIQUE NONCLUSTERED INDEX uniquey_thingumyjig
  ON table_name (PersonId)
    WHERE  IsPrimary = 1

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

您正在尝试使用数据而不是实际关系在两个实体之间创建关系。每个人有一个主phone号和多个非主phone号。与其使用数据(在您的情况下为 IsPrimary 列)描述主要的 phone 数字关系,不如将其作为 Persons table:

中的外键
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

这样一来,一个人只能拥有一个小学phone。此外,如果有人更换了他们的 phone 主号码,您只需更新一行。如果您持有 IsPrimary 列,则必须更新两行(将旧主设置为 0,然后将新主设置为 1),并确保这两个更新发生在同一事务中,否则您可能如果第二行无法更新,则完全失去主要。