Używam „ON DELETE CASCADE” regularnie, ale nigdy nie używam „ON UPDATE CASCADE”, ponieważ nie jestem pewien, w jakiej sytuacji będzie to przydatne.
Dla celów dyskusji zobaczmy trochę kodu.
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
);
W przypadku „PRZY USUWANIU KASKADY”, jeśli rodzic nadrzędny z id
zostanie usunięty, zapis podrzędny z parent_id = parent.id
zostanie automatycznie usunięty. To nie powinno być problemu.
Oznacza to, że „ON UPDATE CASCADE” zrobi to samo, gdy
id
rodzic zostanie zaktualizowany?Jeśli (1) jest prawdą, oznacza to, że nie ma potrzeby używania opcji „ON UPDATE CASCADE”, jeśli
parent.id
nie można jej aktualizować (lub nigdy nie będzie aktualizowana), tak jak ma to miejsceAUTO_INCREMENT
lub zawsze jest ustawioneTIMESTAMP
. Czy to prawda?Jeśli (2) nie jest prawdziwe, w jakiej innej sytuacji powinniśmy użyć „ON UPDATE CASCADE”?
Co się stanie, jeśli (z jakiegoś powodu) zaktualizuję
child.parent_id
coś, co nie istnieje, czy zostanie to automatycznie usunięte?
Cóż, wiem, niektóre z powyższych pytań można przetestować programowo, aby je zrozumieć, ale chcę również wiedzieć, czy którekolwiek z nich jest zależne od dostawcy bazy danych.
Proszę rzucić trochę światła.