Eu tenho uma tabela, vamos chamá-la de pai :
CREATE TABLE parent (
id TEXT PRIMARY KEY,
name TEXT,
description TEXT,
-- other parent attributes
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
);
Ele tem várias tabelas filhas, digamos child_1 , child_2 , ... child_n . Todos eles se parecem com:
CREATE TABLE child_n (
id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
parent_id TEXT NOT NULL REFERENCES parent (id) ON DELETE CASCADE,
-- other columns of child_n attributes
);
Algumas dessas crianças podem até ter suas próprias tabelas filhas.
Quando atualizo uma linha no pai, muitas vezes também quero substituir todos os seus descendentes (ou seja: seus filhos, seus filhos e assim por diante recursivamente), pois eles são relevantes apenas para a versão mais antiga dessa linha pai.
Meu plano era confiar nisso REFERENCES parent (id) ON DELETE CASCADE
, mas isso só funciona se eu realmente excluir o pai. Eu sei que posso excluir e inserir em uma transação, mas isso torna a preservação dos valores das colunas (como created_at
) mais complicada.
Existe uma maneira de acionar a exclusão em cascata de filhos sem realmente excluir a linha pai?