web-dev-qa-db-fra.com

Puis-je ajouter une contrainte UNIQUE à une table PostgreSQL après l'avoir créée?

J'ai le tableau suivant:

 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 ait jamais plus d'une colonne pour une paire donnée tickername/tickerbbname. J'ai déjà créé la table et contient beaucoup de données (ce qui m'a déjà permis de répondre aux critères uniques). Au fur et à mesure qu’il grandit, une marge d’erreur se glisse.

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

161
Thomas Browne

L'aide en ligne de psql:

\h ALTER TABLE

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

ALTER TABLE tablename ADD CONSTRAINT constraintname UNIQUE (columns);
319
hhaamu

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);
31
Zeck

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.

5
Jordan S. Jones

Si vous aviez déjà une contrainte existante dans une table basée sur, disons: nom et nom et que vous vouliez ajouter une contrainte unique supplémentaire, vous deviez supprimer toute la contrainte:

ALTER TABLE your_table DROP CONSTRAINT constraint_name;

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 NULL) pour toutes les données de cette table, puis vous pouvez la recréer.

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