W Postgresql wymuś unikalne połączenie dwóch kolumn

191

Chciałbym skonfigurować tabelę w PostgreSQL tak, aby dwie kolumny razem były niepowtarzalne. Może istnieć wiele wartości każdej z tych wartości, o ile nie ma dwóch takich samych.

Na przykład:

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

Tak, col1i col2może powtórzyć, ale nie w tym samym czasie. Tak więc byłoby to dozwolone (bez identyfikatora)

1 1
1 2
2 1
2 2

ale nie to:

1 1
1 2
1 1 -- would reject this insert for violating constraints
PearsonArtPhoto
źródło
Ponieważ jest to najwyższy wynik wyszukiwania w google, być może lepiej podać również alter alter table
ϻαϻɾΣɀО-MaMrEzO

Odpowiedzi:

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

autoincrementnie jest postgresql. Chcesz serial.

Jeśli col1 i col2 tworzą unikat i nie mogą mieć wartości NULL, to tworzą dobry klucz podstawowy:

CREATE TABLE someTable (
    col1 int NOT NULL,
    col2 int NOT NULL,
    primary key (col1, col2)
)
Clodoaldo Neto
źródło
6
Podoba mi się tutaj sugestia klucza podstawowego zamiast unikalnego, ponieważ w tym przypadku nie zezwalamy na wartości NULL. Od docs PostgeSQL: „Należy pamiętać, że ograniczenie przez unikalność nie jest w stanie sama zapewnić niepowtarzalny identyfikator, ponieważ nie uwzględniają wartości null).” Postgresql.org/docs/8.1/static/ddl-constraints.html#AEN2038
ndequeker
Jak mogę to zaimplementować w definicji schematu?
wagng
2
W niektórych scenariuszach możesz chcieć używać klucza zastępczego jako klucza podstawowego zamiast kombinacji kolumn. W szczególności w celu poprawy wydajności podczas wykonywania połączeń na woluminach dużych zbiorów danych. Osobiście wybrałem rozwiązanie UNIKALNE OGRANICZENIE poniżej.
Alexis.Rolland
1
Czy można wymusić unikalne ograniczenie tylko dla jednej permutacji, takie jak unikalne (col1, col2 = „1”)?
Vikram Khemlani,
160

Stwórz unikalne ograniczenie, że dwie liczby NIE MOGĄ być razem powtarzane:

ALTER TABLE someTable
ADD UNIQUE (col1, col2)
djangojazz
źródło
18

Wygląda jak zwykły UNIKALNY KONTRAKT :)

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

Więcej tutaj

Timur Sadykov
źródło
1
Czy to dodaje indeks ai indeks dla cniezależnie? Ponieważ muszę szybko znaleźć na podstawie aczasami i szybko znaleźć na podstawie cczasami.
CMCDragonkai