Posso aggiungere un vincolo UNIQUE a una tabella PostgreSQL, dopo che è già stato creato?


185

Ho la seguente tabella:

 tickername | tickerbbname  | tickertype
------------+---------------+------------
 USDZAR     | USDZAR Curncy | C
 EURCZK     | EURCZK Curncy | C
 EURPLN     | EURPLN Curncy | C
 USDBRL     | USDBRL Curncy | C
 USDTRY     | USDTRY Curncy | C
 EURHUF     | EURHUF Curncy | C
 USDRUB     | USDRUB Curncy | C

Non voglio che ci sia mai più di una colonna per ogni dato tickername/ tickerbbnamecoppia. Ho già creato la tabella e contiene molti dati (che ho già assicurato soddisfa i criteri univoci). Man mano che si ingrandisce, però, si insinua spazio per l'errore.

Esiste un modo per aggiungere un UNIQUEvincolo a questo punto?


Risposte:


363

psqlGuida in linea:

\h ALTER TABLE

Documentato anche nei documenti di Postgres (una risorsa eccellente, oltre a essere di facile lettura).

ALTER TABLE tablename ADD CONSTRAINT constraintname UNIQUE (columns);

6
grazie @hhaamu. Sì, ho provato i documenti, ma il tuo sopra è molto più conciso.
Thomas Browne,

117
Se si desidera consentire a PostgreSQL di generare il nome dell'indice, utilizzare ALTER TABLE tablename ADD UNIQUE (columns);. (Nota che la CONSTRAINTparola chiave deve essere omessa.)
jpmc26

5
Avevo bisogno di una risposta a questa domanda e ho iniziato a cercare su Google i documenti. Invece della documentazione di Postgres, ho incontrato questo argomento su StackOverflow. Quindi, anche se è una buona idea fare riferimento ai documenti ufficiali, è anche molto buono dare la risposta per le visite future. Grazie per questo.
Leonard,

@ jpmc26 «Se vuoi che PostgreSQL generi il nome dell'indice» Intendi il nome del vincolo?
tuxayo,

4
@tuxayo, un vincolo univoco viene implementato tramite un indice in Postgres (per non essere pedante).
Chris W.

36

Si, puoi. Ma se hai voci non uniche sulla tua tabella, fallirà. Ecco come aggiungere un vincolo univoco alla tabella. Se stai usando PostgreSQL 9.x puoi seguire le istruzioni seguenti.

CREATE UNIQUE INDEX constraint_name ON table_name (columns);

3
Grazie Zeck - bella risposta 2 anni dopo, ma apprezzo ancora che le persone si prendano ancora del tempo! Tom
Thomas Browne,

1
Non è corretto Negli ultimi Postgres questo porta anche al messaggio come "La chiave (uuid) = (3a533772-07ac-4e76-b577-27a3878e2222) è duplicata. Query fallita" se hai un valore che non è unico ...
Strinder

3
@Strinder, come mai non è una buona cosa? correggere prima i dati duplicati.
Jasen,

3
@Jasen È del tutto chiaro. Volevo solo sottolineare che la risposta "Ma se si dispone di voci non univoche sulla tabella. Ecco come aggiungere un vincolo univoco sulla tabella." non funzionerà. Ovviamente le voci non uniche devono sempre essere consolidate in anticipo.
Strinder,

Modificata la risposta per chiarezza
Xavier Ho

6

Se avevi una tabella che aveva già un vincolo esistente basato su diciamo: nome e cognome e volevi aggiungere un altro vincolo univoco, devi eliminare l'intero vincolo:

ALTER TABLE your_table DROP CONSTRAINT constraint_name;

Assicurati che il nuovo vincolo che desideri aggiungere sia univoco / non nullo (se si tratta di Microsoft SQL, può contenere solo un valore null) su tutti i dati in quella tabella, quindi puoi ricrearlo.

ALTER TABLE table_name
ADD CONSTRAINT constraint_name UNIQUE (column1, column2, ... column_n);

5

Sì, è possibile aggiungere un vincolo UNICO dopo il fatto. Tuttavia, se nella tabella sono presenti voci non univoche Postgres si lamenterà fino a quando non le correggerai.


7
select <column> from <table> group by 1 having count(*) > 1;fornirà un rapporto sui valori duplicati.
Jasen,
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.