创建复合键
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
您正在尝试使用数据而不是实际关系在两个实体之间创建关系。每个人有一个主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),并确保这两个更新发生在同一事务中,否则您可能如果第二行无法更新,则完全失去主要。
我有一个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
您正在尝试使用数据而不是实际关系在两个实体之间创建关系。每个人有一个主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),并确保这两个更新发生在同一事务中,否则您可能如果第二行无法更新,则完全失去主要。