2017-10-04 1 views
-1

J'ai une contrainte unique postgresql à se joindre à partir de deux tables de l'IdPostgresql contrainte unique pour permettre à deux voies combinaison

TableA 
IdA 
1 
2 
3 

TableB 
IdB 
1 
2 
3 

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

Mais si je veux insérer l'autre Id de

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) 

Mon unique, est:

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

Comment puis-je insérer deux façons (1 2 ET 2 1)?

Un autre changement unique?

Ty pour m'aider !!!

+0

tableJoin est en fait une table - pas rejoindre .. –

+0

Oui, TableJoin est une table avoir deux Is – RaZoDiuM

+0

Donc la ligne {1,2} signifie exactement la même chose que la ligne {2, 1}? –

Répondre

0

Il a été répondu quelque part.

essentiellement pour les entiers, serait le moyen le plus créerez un Royaume-Uni comme ceci:

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

pour non entiers, vous pouvez ajouter à la matrice et unnest avec l'ordre de l'indice. et même une autre façon était avec les fonctions jsonb je crois. Mais plus/moins est la meilleure option pour l'index entier deux clés ...

est ici un exemple:

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

N'est pas la solution, maintenant j'ai le problème avec les mêmes valeurs (2 2, 3 3, 4 4, ....) – RaZoDiuM

+1

désolé - je dois avoir mal interprété votre message - je pensais que vous vouliez UK donc 1,2 ne permettrait pas 2,1 paires, et donc 2,2 ne permettra pas 2,2 - oui –