J'utilise régulièrement "ON DELETE CASCADE" mais je n'utilise jamais "ON UPDATE CASCADE" car je ne sais pas trop dans quelle situation il sera utile.
Pour les besoins de la discussion, voyons du code.
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
);
Pour "ON DELETE CASCADE", si un parent avec un id
est supprimé, un enregistrement en enfant avec parent_id = parent.id
sera automatiquement supprimé. Cela ne devrait pas poser de problème.
Cela signifie que "ON UPDATE CASCADE" fera la même chose lorsque
id
le parent est mis à jour?Si (1) est vrai, cela signifie qu'il n'est pas nécessaire d'utiliser "ON UPDATE CASCADE" s'il
parent.id
n'est pas modifiable (ou ne sera jamais mis à jour) comme lorsqu'il estAUTO_INCREMENT
ou est toujours défini pour l'êtreTIMESTAMP
. Est-ce correct?Si (2) n'est pas vrai, dans quel autre type de situation devrions-nous utiliser "ON UPDATE CASCADE"?
Que se passe-t-il si je (pour une raison quelconque) met à jour le
child.parent_id
pour qu'il ne soit pas quelque chose d'existant, sera-t-il alors automatiquement supprimé?
Eh bien, je sais, certaines des questions ci-dessus peuvent être testées par programme pour comprendre, mais je veux également savoir si tout cela dépend du fournisseur de base de données ou non.
Veuillez faire la lumière.