2009-07-28 8 views
97

J'ai le tableau suivant:Puis-je ajouter une contrainte UNIQUE à une table PostgreSQL, après qu'elle a déjà été créée?

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 

Je ne veux pas qu'il y jamais plus d'une colonne pour une paire donnée tickername/tickerbbname. J'ai déjà créé la table et j'ai beaucoup de données (ce que j'ai déjà assuré répond aux critères uniques). Au fur et à mesure qu'il prend de l'ampleur, une marge d'erreur s'installe.

Est-il possible d'ajouter une contrainte UNIQUE à ce stade?

+0

double possible de [Comment modifier une table de PostgreSQL et faire une colonne unique?] (Http://stackoverflow.com/questions/469471/how-do-i-alter-a-postgresql-table -and-make-a-column-unique) –

Répondre

205

psql « s aide en ligne:

\h ALTER TABLE 

également documenté dans le postgres docs (une excellente ressource, plus facile à lire aussi).

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

merci @hhaamu. Yep a essayé les docs mais votre ci-dessus est beaucoup plus concis. –

+54

Si vous voulez laisser PostgreSQL générer le nom de l'index, utilisez 'ALTER TABLE tablename ADD UNIQUE (colonnes);'. (Notez que le mot clé 'CONSTRAINT' doit être omis.) – jpmc26

+2

J'avais besoin d'une réponse à cette question et j'ai commencé à chercher des docs. Au lieu de la documentation Postgres, j'ai rencontré ce sujet sur StackOverflow. Donc, même si c'est une bonne idée de référencer les documents officiels, il est également très bon de donner la réponse aux futures visites. Merci pour ça. – Leonard

2

Oui, vous pouvez ajouter une contrainte UNIQUE après le fait. Cependant, si vous avez des entrées non-uniques dans votre table, Postgres s'en plaindra jusqu'à ce que vous les corrigiez.

+3

'sélectionner partir de

groupe par 1 ayant compte (*)> 1;' donnera un rapport sur les valeurs dupliquées. – Jasen

25

Oui, vous pouvez. Mais si vous avez des entrées non uniques sur votre table, cela échouera. Voici comment ajouter une contrainte unique sur votre table. Si vous utilisez PostgreSQL 9.x, vous pouvez suivre les instructions ci-dessous.

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

Merci Zeck - belle réponse 2y plus tard, mais apprécie toujours que les gens prennent encore le temps! Tom –

+1

Ce n'est pas correct. Dans la dernière Postgres cela conduit aussi au message comme "Clé (uuid) = (3a533772-07ac-4e76-b577-27a3878e2222) est dupliqué La requête a échoué" si vous avez une valeur qui n'est pas unique ... – Strinder

+1

@ Strinder, comment n'est-ce pas une bonne chose? réparez les données dupliquées en premier. – Jasen

0

Si vous aviez une table qui avait déjà une des contraintes existantes sur la base permet de dire:

ALTER TABLE your_table DROP CONSTRAINT constraint_name; 
: nom et nom et que vous vouliez ajouter une de plus contrainte unique, il fallait abandonner l'ensemble Contraindre

Assurez-vous que la nouvelle contrainte que vous souhaitez ajouter est unique/non nulle (si Microsoft SQL, elle ne peut contenir qu'une seule valeur nulle) sur toutes les données de cette table, et vous pouvez ensuite la recréer.

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