繁体   English   中英

可互换的复合主键

[英]Interchangeable, composite primary keys

我有一个表foo ,它只有两个字段: fooIdAfooIdB (两者都属于同一类型)。 这些是复合主键,因此:

primary key (fooIdA, fooIdB)...

考虑到这一点,如何使键的所有排列都相同?
也就是说, (fooIdA, fooIdB) = (fooIdB, fooIdA)

根据您的DBMS,可以在表达式上创建唯一索引,以防止插入(1,2)(2,1)

在Postgres和Oracle中,您可以执行以下操作:

create unique index unique_combinations 
    on the_table (least(fooida, fooidb), greatest(fooida, fooidb));

您没有指定RDBMS。 您还可以添加具有MAX,MIN值的计算字段,并在这些计算字段上添加UNIQUE约束。 这是MSSQL示例:

CREATE TABLE ATest (id1 int, id2 int);

ALTER TABLE ATest ADD idMax AS (CASE WHEN id1>=id2 THEN id1 ELSE id2 END);  
ALTER TABLE ATest ADD idMin AS (CASE WHEN id1>=id2 THEN id2 ELSE id1 END);  
ALTER TABLE ATest ADD CONSTRAINT UniqueConstCalc UNIQUE(idMax,idMin);

insert into ATest values (1,1);
insert into ATest values (1,2);
insert into ATest values (2,1);

(1 row(s) affected)

(1 row(s) affected)

Msg 2627, Level 14, State 1, Line 3
Violation of UNIQUE KEY constraint 'UniqueConstCalc'. 
Cannot insert duplicate key in object 'dbo.ATest'. 
The duplicate key value is (2, 1).
The statement has been terminated.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM