Mise à jour du nom de la contrainte dans PostgreSQL

90

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

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

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

Merci!

Milen A. Radev
la source

Réponses:

82

Pour la clé primaire, vous devriez pouvoir simplement:

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 supprimer l'ancien et d'en créer un nouveau. Assurez-vous de le faire dans une transaction, afin que le système ne soit pas opérationnel pendant la reconstruction. (Et si vous ne pouvez pas le faire dans une transaction, assurez - vous de créer le nouveau premier , avant de laisser tomber l'ancien)

Magnus Hagander
la source
154

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;
Arturo Herrero
la source
1
@ArturoHerrero pourrions-nous renommer plusieurs contraintes à la fois, si oui, comment?
Erlan
1
@Erlan vous pouvez obtenir la liste de toutes les contraintes via une requête à pg_catalog, itérer dessus via LOOPet utiliser une requête dynamique pour renommer.
Evgeny Nozdrev
1

Nous avons constaté que les clés primaires sont souvent en retard sur le nom de la table principale. Ce script nous a aidés à identifier et à résoudre les problèmes.

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';

Cela 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 script de changement de nom pour chacune.

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

Évidemment, vérifiez ce qui est renvoyé avant de l'exécuter. J'espère que cela sera utile pour les autres.

Paul Grimshaw
la source