Actualización del nombre de la restricción en PostgreSQL

91

¿Es posible cambiar el nombre de la restricción en Postgres? Tengo un PK agregado con:

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

Y quiero que se le dé un nombre diferente, para ser coherente con el resto del sistema. ¿Debo eliminar la restricción PK existente y crear una nueva? ¿O hay una forma "suave" de gestionarlo?

¡Gracias!

Milen A. Radev
fuente

Respuestas:

82

Para la clave principal, debería poder simplemente:

ALTER INDEX commerce_contractor_pkey RENAME TO whatever_new_name

Sin embargo, eso no funcionará para otros tipos de restricciones. La mejor opción es eliminar el anterior y crear uno nuevo. Asegúrese de hacerlo dentro de una transacción, para que el sistema no funcione sin él durante la reconstrucción. (Y si no puede hacerlo en una transacción, asegúrese de crear la nueva primero , antes de eliminar la anterior)

Magnus Hagander
fuente
155

Para cambiar el nombre de una restricción existente en PostgreSQL 9.2 o más reciente , puede usar ALTER TABLE :

ALTER TABLE name RENAME CONSTRAINT constraint_name TO new_constraint_name;
Arturo Herrero
fuente
1
@ArturoHerrero ¿Podríamos cambiar el nombre de varias restricciones a la vez? Si es así, ¿cómo?
Erlan
1
@Erlan puede obtener la lista de todas las restricciones a través de una consulta pg_catalog, iterar sobre ella LOOPy usar una consulta dinámica para cambiar el nombre.
Evgeny Nozdrev
1

Descubrimos que las claves primarias a menudo se quedan atrás del nombre de la tabla principal. Este script nos ayudó a identificar y solucionar los problemas.

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

Esto busca todas las tablas donde el nombre de la clave principal ya no es el patrón "predeterminado" ( <tablename>_pkey) y crea un script de cambio de nombre para cada una.

El límite de 58 caracteres en el código anterior es para tener en cuenta el tamaño máximo de los nombres de restricción (63bytes).

Obviamente, compruebe lo que se devuelve antes de ejecutarlo. Espero que sea útil para los demás.

Paul Grimshaw
fuente