2016-11-10 79 views
1

我有一個表foo僅具有兩個字段:fooIdAfooIdB(均爲相同類型的)。這些是複合主鍵,因此:可互換,複合主鍵

primary key (fooIdA, fooIdB)... 

考慮到這一點,我怎樣才能使所有按鍵的排列都相同?
也就是說,(fooIdA, fooIdB) = (fooIdB, fooIdA)

+0

你的意思是當你插入一個主鍵也插入它的另一個排列? –

+0

@αNerd沒有,我想,其他排列被認爲是第一個副本。 – Patrick

+0

您可以使用觸發器來檢查,如果其他組合已經存在。 – Ubercool

回答

3

根據你的DBMS,你可以創建一個表達式一個唯一索引防止插入(1,2)(2,1)

在Postgres裏和Oracle,你可以這樣做:

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

你不指定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.