2009-07-28 6 views
97

Ho la seguente tabella:Posso aggiungere un vincolo UNIQUE a una tabella PostgreSQL, dopo che è già stata creata?

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 tickername/tickerbbname coppia. Ho già creato la tabella e ci sono molti dati (che ho già assicurato soddisfa i criteri univoci). A mano a mano che si ingrandisce, c'è spazio per errori.

C'è un modo per aggiungere un vincolo UNIQUE a questo punto?

+0

possibile duplicato di [Come faccio a modificare una tabella di PostgreSQL e fare una colonna univoca?] (Http://stackoverflow.com/questions/469471/how-do-i-alter-a-postgresql-table -e-make-a-column-unique) –

risposta

205

s' psql linea di aiuto:

\h ALTER TABLE 

documentato anche nel postgres docs (una risorsa eccellente, più facile da leggere, anche).

ALTER TABLE tablename ADD CONSTRAINT constraintname UNIQUE (columns); 
+1

grazie @hhaamu. Sì ha provato i documenti ma il tuo sopra è molto più conciso. –

+54

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

+2

Avevo bisogno di una risposta a questa domanda e ho iniziato a cercare su google i documenti. Invece della documentazione di Postgres, mi sono imbattuto in questo argomento su StackOverflow. Quindi, anche se è bene fare riferimento ai documenti ufficiali, è anche molto utile dare la risposta per le visite future. Grazie per questo. – Leonard

2

Sì, è possibile aggiungere un vincolo UNIQUE dopo il fatto. Tuttavia, se hai voci non univoche nella tua tabella Postgres si lamenterà di ciò finché non le correggerai.

+3

'selezionare da

gruppo per 1 conteggio (*)> 1;' fornirà un report sui valori duplicati. – Jasen

25

Sì, è possibile. Ma se hai voci non univoche sul tuo tavolo, fallirà. Ecco come aggiungere un vincolo univoco sul tuo tavolo. Se stai utilizzando PostgreSQL 9.x puoi seguire le istruzioni di seguito.

CREATE UNIQUE INDEX constraint_name ON table_name (columns); 
+3

Grazie Zeck - bella risposta in 2 secondi più tardi, ma apprezzo ancora che la gente prende ancora il tempo! Tom –

+1

Questo non è corretto. In tutte le Postgres questo porta anche al messaggio come "Chiave (uuid) = (3a533772-07ac-4e76-b577-27a3878e2222) viene duplicato. Query non riuscita" se si dispone di un valore che non è unico ... – Strinder

+1

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

0

Se si ha una tabella che già ha avuto un vincoli esistenti sulla base permette di dire: nome e cognome e di voler aggiungere un altro vincolo univoco, si doveva far cadere l'intero vincolo da:

ALTER TABLE your_table DROP CONSTRAINT constraint_name; 

Assicurarsi che il nuovo vincolo che si desidera aggiungere sia univoco/non nullo (se Microsoft Sql, può contenere solo un valore null) su tutti i dati su quella tabella e quindi è possibile ricrearlo.

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