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:

  1. Primeiro atualizamos a tabela my_awesome_table;
  2. Agora, removemos a constraint anterior;
  3. 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 tabela my_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