避免 SQL 表中出现重复的值“对”(两列)

sou*_*ike 5 sql t-sql azure-sql-database

我有一张记录家庭成员之间关系的表,我想确保始终只有一条记录包含相同的两个人 - 但现在有两列和两个值需要考虑。我已经搜索了几个小时,虽然我确定它就在那里,但我还没有找到。

我有一个表,其中的外键 (Persons.ID) 会出现在 aID 和 bID(两个人)中。我有另一个角色表(母亲、女儿、叔叔、兄弟姐妹等),其外键(Roles.ID)将出现在 aID_role 和 bID_role 中。(我试图在此表中仅存储整数,因为它最终可能会有相当多的记录。)

Relationships
----------------------------------------
aID     aID_role     bID     bID_role
----------------------------------------
 4        1           5        2
Run Code Online (Sandbox Code Playgroud)

假设 aID 4 是 John,bID 5 是 Carla。aID_role 1 是“父亲”,bID_role 2 是“女儿”。

如何防止输入下面的第二条记录?

Relationships
----------------------------------------
aID     aID_role     bID     bID_role
----------------------------------------
 4        1           5        2
 5        2           4        1 <-- sort of a duplicate
Run Code Online (Sandbox Code Playgroud)

请注意,我对比较“_role”列不感兴趣。它们在这里是非物质的;我想避免 Person.ID 4 和 5 出现在关系表中的多个记录中。

数据库位于 Azure SQL 中。

Sal*_*n A 3

您可以创建镜像 id 的计算列,如下所示:

id1 AS (CASE WHEN aID < bID THEN aid ELSE bid END),
id2 AS (CASE WHEN aID < bID THEN bid ELSE aid END),
Run Code Online (Sandbox Code Playgroud)

那么两个重复的行将如下所示:

aID  bID  id1  id2
4    5    4    5
5    4    4    5
Run Code Online (Sandbox Code Playgroud)

您只需要创建一个 UNIQUE 约束:

CONSTRAINT IX_Relationships UNIQUE (id1, id2)
Run Code Online (Sandbox Code Playgroud)