113 votes

Mise à jour du nom de la contrainte dans PostgreSQL

Est-il possible de changer le nom de la contrainte dans Postgres ? J'ai une PK ajoutée avec :

ALTER TABLE contractor_contractor ADD CONSTRAINT commerce_contractor_pkey PRIMARY KEY(id);

Et je veux qu'il ait un nom différent, pour être cohérent avec le reste du système. Dois-je supprimer la contrainte PK existante et en créer une nouvelle ? Ou existe-t-il une manière "douce" de gérer cela ?

Merci !

195voto

Arturo Herrero Points 3676

Pour renommer une contrainte existante dans PostgreSQL 9.2 ou plus récent vous pouvez utiliser ALTER TABLE :

ALTER TABLE name RENAME CONSTRAINT constraint_name TO new_constraint_name;

94voto

Magnus Hagander Points 8671

Pour la clé primaire, vous devriez être en mesure de juste :

ALTER INDEX commerce_contractor_pkey RENAME TO whatever_new_name

Cela ne fonctionnera pas pour d'autres types de contraintes. La meilleure option est de laisser tomber l'ancienne et d'en créer une nouvelle. Assurez-vous de le faire à l'intérieur d'une transaction, afin que le système ne vive pas sans lui pendant la reconstruction. (Et si vous ne pouvez pas le faire dans une transaction, assurez-vous de créer le nouveau ) primero avant de laisser tomber l'ancien)

3voto

Paul Grimshaw Points 3004

Nous avons constaté que les clés primaires sont souvent en retard sur le nom de la table principale. Ce script nous a permis d'identifier et de corriger celles qui posaient problème.

select 
    table_name, 
    constraint_name , 
    'ALTER TABLE ' || table_name || ' RENAME CONSTRAINT ' || constraint_name || ' TO ' || left(table_name, 58) || '_pkey;'
from information_schema.table_constraints tc
where constraint_type  = 'PRIMARY KEY' 
and constraint_name <> left(table_name, 58) || '_pkey';

Ceci trouve toutes les tables où le nom de la clé primaire n'est plus le modèle "par défaut" ( <tablename>_pkey ) et crée un renommage script pour chacun.

La limite de 58 caractères dans le code ci-dessus est destinée à tenir compte de la taille maximale des noms de contraintes (63bytes).

Il faut évidemment vérifier ce qui est renvoyé avant de l'exécuter. J'espère que cela sera utile à d'autres.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X