gpt4 book ai didi

sql - 在两列上检查唯一的有效方法?

转载 作者:行者123 更新时间:2023-12-01 16:26:33 25 4
gpt4 key购买 nike

我在 SQL Server 2012 中有一个表,其中包含两个国家/地区的列,我们将它们称为 CountryA 和 CountryB。

CREATE TABLE dbo.AgreementParticipants
(
AgreementParticipantsID INT NOT NULL PRIMARY KEY IDENTITY,
CountryA CHAR(3) NOT NULL FOREIGN KEY REFERENCES dbo.Country (CountryCode),
CountryB CHAR(3) NOT NULL FOREIGN KEY REFERENCES dbo.Country (CountryCode)
);

注意:该表已针对示例进行了简化,但重要的是它始终定义两个实体之间的双边关系。碰巧的是,在本例中是两个国家。

典型数据:

1 AUS USA
2 USA NZL

业务规则:

  1. 总会有两个县。
  2. 这两个国家可以采用任意顺序。位置 A 或 B 没有任何意义。
  3. 两个国家/地区的每个组合在表格中都必须是唯一的。因此,AUS USA 被视为与 USA AUS 相同。
  4. 这两个国家永远不会一样。

问题:

强制执行唯一性约束的最有效方法是什么?

目前,我考虑过使用触发器或复杂的检查约束,但这两种解决方案都感觉不太优雅,因此我希望获得社区的一些意见。

最佳答案

您可以通过两个条件来执行此操作。第一个是唯一索引(或约束):

create unique index AgreementParticipants_CountryA_CountryB on AgreementParticipants(CountryA, CountryB)

第二个条件是 CountryA小于CountryB :

check (CountryA < CountryB)

如果国家/地区可以相同,那么条件将是 <= .

这种方法的一个缺点是,在插入时,CountryA必须小于CountryB (按字母顺序排列)。否则,这会生成错误。

另一种方法使用计算列和唯一索引:

alter table AgreementParticipants
add Country1 as (case when CountryA < CountryB then CountryA else CountryB end);

alter table AgreementParticipants
add Country2 as (case when CountryA < CountryB then CountryB else CountryA end);

create unique index AgreementParticipants_Country1_Country2 on AgreementParticipants(Country1, Country2);

这种方法的优点是可以按任意顺序将国家/地区插入表中。

关于sql - 在两列上检查唯一的有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23600804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com