我有一個表foo
僅具有兩個字段:fooIdA
和fooIdB
(均爲相同類型的)。這些是複合主鍵,因此:可互換,複合主鍵
primary key (fooIdA, fooIdB)...
考慮到這一點,我怎樣才能使所有按鍵的排列都相同?
也就是說,(fooIdA, fooIdB) = (fooIdB, fooIdA)
。
我有一個表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值添加計算字段以及對這些計算字段添加唯一約束。這裏是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.
你的意思是當你插入一個主鍵也插入它的另一個排列? –
@αNerd沒有,我想,其他排列被認爲是第一個副本。 – Patrick
您可以使用觸發器來檢查,如果其他組合已經存在。 – Ubercool