2013-01-08 11 views
75

Chciałbym ustawić tabelę w postgresql tak, że dwie kolumny razem muszą być unikalne. Może istnieć wiele wartości dowolnej wartości, o ile nie ma dwóch, które dzielą obie.W Postgresql, Force unique na połączeniu dwóch kolumn

Na przykład:

CREATE TABLE someTable (
    id int PRIMARY KEY AUTOINCREMENT, 
    col1 int NOT NULL, 
    col2 int NOT NULL 
) 

Więc col1 i col2 można powtórzyć, ale nie w tym samym czasie. Tak, to będzie mogła (nie licząc id)

1 1 
1 2 
2 1 
2 2 

ale nie w ten sposób:

1 1 
1 2 
1 1 -- would reject this insert for violating constraints 

Odpowiedz

86
CREATE TABLE someTable (
    id serial primary key, 
    col1 int NOT NULL, 
    col2 int NOT NULL, 
    unique (col1, col2) 
) 

autoincrement nie jest postgresql. Chcesz serial.

Jeśli col1 i col2 uczynić wyjątkowym i nie może być null potem zrobić dobry klucz podstawowy:

CREATE TABLE someTable (
    col1 int NOT NULL, 
    col2 int NOT NULL, 
    primary key (col1, col2) 
) 
+3

Podobają mi się sugestie klucza podstawowego nad unikatowym tutaj, ponieważ nie dopuszczamy w tym przypadku wartości NULL. Z dokumentów PostgeSQL: "Należy zauważyć, że unikalne ograniczenie samo w sobie nie dostarcza unikalnego identyfikatora, ponieważ nie wyklucza wartości pustych.)" Https://www.postgresql.org/docs/8.1/static/ddl-constraints .html # AEN2038 – Voles

7

Wydaje się regularnie UNIQUE CONSTRAINT :)

CREATE TABLE example (
a integer, 
b integer, 
c integer, 
UNIQUE (a, c)); 

Więcej here

55

stworzyć wyjątkowe ograniczenie, że dwa numery razem NIE MOŻE razem być powtarzany:

ALTER TABLE someTable 
ADD UNIQUE (col1, col2) 
Powiązane problemy