Uso "ON DELETE CASCADE" regularmente, mas nunca uso "ON UPDATE CASCADE", pois não tenho tanta certeza de que situação será útil.
Para fins de discussão, vamos ver algum código.
CREATE TABLE parent (
id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (id)
);
CREATE TABLE child (
id INT NOT NULL AUTO_INCREMENT, parent_id INT,
INDEX par_ind (parent_id),
FOREIGN KEY (parent_id)
REFERENCES parent(id)
ON DELETE CASCADE
);
Para "ON DELETE CASCADE", se um pai com um id
for excluído, um registro em filho com parent_id = parent.id
será excluído automaticamente. Isso não deve ser problema.
Isso significa que "ON UPDATE CASCADE" fará a mesma coisa quando
id
o pai for atualizado?Se (1) for verdadeiro, significa que não há necessidade de usar "ON UPDATE CASCADE" se
parent.id
não for atualizável (ou nunca será atualizado) como quando estáAUTO_INCREMENT
ou sempre está definido para serTIMESTAMP
. Isso está certo?Se (2) não for verdade, em que outro tipo de situação devemos usar "ON UPDATE CASCADE"?
E se eu (por algum motivo) atualizar o arquivo
child.parent_id
como algo inexistente, ele será excluído automaticamente?
Bem, eu sei que algumas das perguntas acima podem ser testadas programaticamente para entender, mas também quero saber se alguma delas depende ou não de um fornecedor de banco de dados.
Por favor, mostre alguma luz.