[英]Interchangeable, composite primary keys
我有一个表foo
,它只有两个字段: fooIdA
和fooIdB
(两者都属于同一类型)。 这些是复合主键,因此:
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.