In Postgresql, forza univoco sulla combinazione di due colonne


192

Vorrei impostare una tabella in PostgreSQL in modo tale che due colonne insieme debbano essere uniche. Possono esserci più valori per entrambi i valori, purché non ce ne siano due che condividano entrambi.

Per esempio:

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

Quindi, col1e col2può ripetere, ma non allo stesso tempo. Quindi, questo sarebbe permesso (escluso l'id)

1 1
1 2
2 1
2 2

ma non questo:

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

Poiché questo è un risultato di ricerca di alto livello in Google, forse è meglio fornire anche una tabella di modifica
--αϻɾΣɀО-MaMrEzO

Risposte:


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

autoincrementnon è postgresql. Tu vuoi un serial.

Se col1 e col2 rendono univoco e non possono essere nulli, creano una buona chiave primaria:

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

6
Mi piace il suggerimento di una chiave primaria su unica qui, perché in questo caso non consentiamo valori NULL. Dalla documentazione PostgeSQL: "Si noti che un vincolo univoco non, di per sé, fornire un identificatore univoco, perché non esclude valori nulli)". Postgresql.org/docs/8.1/static/ddl-constraints.html#AEN2038
ndequeker

Come posso implementarlo nella definizione dello schema?
wagng

2
In alcuni scenari potresti voler utilizzare una chiave surrogata come chiave primaria anziché come combinazione di colonne. In particolare per migliorare le prestazioni quando si eseguono join su volumi di big data. Ho scelto personalmente la soluzione UNICA VINCITORE di seguito.
Alexis.Rolland

1
È possibile applicare un vincolo univoco su una sola permutazione, ad esempio unique (col1, col2 = '1')?
Vikram Khemlani,


160

Crea un vincolo univoco per cui due numeri insieme NON POSSONO essere ripetuti insieme:

ALTER TABLE someTable
ADD UNIQUE (col1, col2)

18

Sembra regolare VINCITORE UNICO :)

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

Più qui


1
Questo aggiunge un indice per ae un indice per cindipendentemente? Perché ho bisogno di trovare rapidamente in base a avolte e trovare rapidamente in base a cvolte.
CMCDragonkai,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.