2017-10-04 55 views
-1

我有PostgreSQL中唯一約束從兩個表中PostgreSQL的唯一約束,允許雙向組合

TableA 
IdA 
1 
2 
3 

TableB 
IdB 
1 
2 
3 

TableJoin 
IdA IdB 
1  1 --good 
1  2 --good 
1  3 --good 

加入編號的,但如果我想插入另一個標識的

TableJoin 
IdA IdB 
1  1 --good 
1  2 --good 
1  3 --good 
2  1 --return error, because already exist 1 2 (I need save 2 1) 
2  2 --good 
2  3 --good 
3  1 --return error, because already exist 1 3 (I need save 3 1) 

我的唯一是:

ALTER TABLE TableJoin ADD CONSTRAINT「UX_Join」UNIQUE(「IdA」,「IdB」);

如何插入兩種方式(1 2 AND 2 1)?

另一個改變獨特?

Ty for help me !!!

+0

tableJoin實際上是一個表 - 而不是加入.. –

+0

是,TableJoin是一個表,有兩個Is's – RaZoDiuM

+0

因此,{1,2}行與{2,1}行的含義完全相同。 –

回答

0

這是在某個地方回答的。對於不是整數

create unique index uk on tablejoin (least(ida,idb), greatest(ida,idb)) 

您可以在索引添加到陣列和UNNEST與秩序:

基本上對於整數,最簡單的將創造英國這樣。甚至另一種方式是我相信jsonb函數。但最大/最小是兩個鍵整數索引的最佳選擇...

這裏有一個例子:

t=# create table a (i int, e int); 
CREATE TABLE 
Time: 27.528 ms 
t=# create unique index u on a (i,e); 
CREATE INDEX 
Time: 25.309 ms 
t=# insert into a select 1,2; 
INSERT 0 1 
Time: 13.972 ms 
t=# insert into a select 2,1; 
INSERT 0 1 
Time: 8.759 ms 
t=# select * from a; 
i | e 
---+--- 
1 | 2 
2 | 1 
(2 rows) 

Time: 14.570 ms 
t=# create unique index u1 on a (least(i,e),greatest(i,e)); 
ERROR: could not create unique index "u1" 
DETAIL: Key ((LEAST(i, e)), (GREATEST(i, e)))=(1, 2) is duplicated. 
Time: 15.241 ms 
+0

是不是解決方案,現在我有問題惠普相同的值(2 2,3 3,4 4,....) – RaZoDiuM

+1

對不起 - 我一定誤解了你的帖子 - 我以爲你想要英國,所以1,2不會讓2,1對,因此2,2不會允許2,2 - 是的 –