Atualizando uma primary key de forma segura no PostgreSQL
Hoje precisei atualizar uma chave primária no ambiente de staging para fazer a validação de uma tarefa que estou fazendo. Minha primeira ação foi ir lá e atualizar diretamente a chave primária. OBVIAMENTE, que estourou um erro, um erro de foreign key!
Para fazer de forma segura essa mudança, eu precisei atualizar a constraint da foreign key. A atualização serve para deixar o postgres responsável pela propagação do novo valor para todas as tabelas que tem uma relação direta com essa primary key.
Dado o devido contexto, segue abaixo a SQL para atualizar a foreign key:
ALTER TABLE my_awesome_table
DROP CONSTRAINT my_awesome_table_primary_table_id_fkey,
ADD CONSTRAINT my_awesome_table_primary_table_id_fkey
FOREIGN KEY (primary_table_id)
REFERENCES primary_table
ON UPDATE CASCADE
DEFERRABLE INITIALLY DEFERRED;
Explicando cada passo da SQL acima:
- Primeiro atualizamos a tabela
my_awesome_table
; - Agora, removemos a constraint anterior;
- Adicionamos uma nova constraint com a tabela
primary_table
, só que agora informando que em caso de atualização, que cascateie essa atualização para a tabelamy_awesome_table
;
Depois de executar a SQL acima, só nos resta atualizar o ID da primary_table
:
UPDATE primary_table SET id = 100 WHERE id = 50
Read other posts