Atualização do nome da restrição no PostgreSQL

94

É possível alterar o nome da restrição no Postgres? Eu tenho um PK adicionado com:

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

E eu quero ter um nome diferente para ele, para ser consistente com o resto do sistema. Devo excluir a restrição de PK existente e criar uma nova? Ou existe uma maneira 'suave' de gerenciar isso?

Obrigado!

Milen A. Radev
fonte

Respostas:

83

Para a chave primária, você deve ser capaz de apenas:

ALTER INDEX commerce_contractor_pkey RENAME TO whatever_new_name

Isso não funcionará para outros tipos de restrições. A melhor opção é abandonar o antigo e criar um novo. Certifique-se de fazer isso dentro de uma transação, para que o sistema não funcione sem ele durante a reconstrução. (E se você não puder fazer isso em uma transação, certifique-se de criar o novo primeiro , antes de descartar o antigo)

Magnus Hagander
fonte
160

Para renomear uma restrição existente no PostgreSQL 9.2 ou mais recente , você pode usar ALTER TABLE :

ALTER TABLE name RENAME CONSTRAINT constraint_name TO new_constraint_name;
Arturo Herrero
fonte
1
@ArturoHerrero podemos renomear em várias restrições de uma vez, se sim, como?
Erlan
1
@Erlan você pode obter a lista de todas as restrições via consulta pg_catalog, iterar sobre ela LOOPe usar uma consulta dinâmica para renomear.
Evgeny Nozdrev
2

Descobrimos que as chaves primárias geralmente ficam atrás do nome da tabela principal. Este script nos ajudou a identificar e corrigir aqueles com 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';

Isso encontra todas as tabelas onde o nome da chave primária não é mais o padrão "padrão" ( <tablename>_pkey) e cria um script de renomeação para cada uma.

O limite de 58 caracteres acima no código acima deve levar em conta o tamanho máximo dos nomes de restrição (63 bytes).

Obviamente, verifique o que é retornado antes de executá-lo. Espero que isso seja útil para outros.

Paul Grimshaw
fonte