Apparemment, MySQL a la contrainte vraiment ennuyante de ne pas pouvoir mettre à jour une table à l'intérieur d'un trigger défini pour cette même table.
J'utilise MySQL version 5.1 et j'obtiens l'erreur: "Impossible de mettre à jour la table dans la fonction/trigger stockée car elle est déjà utilisée par l'instruction qui a appelé cette fonction/déclencheur".MySQL: Mettre à jour une table dans son propre déclencheur
Ce que j'est ceci:
create table folder(
id int unsigned not null auto_increment PRIMARY KEY ,
name varchar(100) not null ,
parentId int unsigned not null
) ;
Il est une structure de dossiers hiérarchique. Un dossier a un nom et éventuellement un dossier parent (sinon parentId
est zéro).
Lorsqu'un dossier est supprimé, j'ai besoin de changer le parentId
de tous les sous-dossiers qui étaient à l'intérieur, de sorte qu'ils ne deviennent pas les enfants d'un dossier inexistant.
Il est assez simple (presque trivial):
CREATE [email protected] TRIGGER onFolderDelete after delete ON folder
FOR EACH ROW update folder set parentId=0 where parentId=old.id ;
Cependant, un tel déclenchement simple, n'est pas autorisé par MySQL parce que, comme je l'ai dit ci-dessus, vous ne pouvez pas mettre à jour une table à l'intérieur de son propre déclencheur.
Existe-t-il un moyen de mettre en œuvre un tel déclencheur en imitant ses effets?
P.S .: Veuillez ne pas suggérer d'envoyer les deux instructions en séquence (DELETE et UPDATE). C'est évidemment la dernière solution si rien d'autre n'est possible.
Edit:
J'utilise le moteur MyISAM (raisons de performance), donc je ne peux pas utiliser les clés étrangères.
J'utilise le moteur MyISAM qui ne supporte pas les clés étrangères. C'est pour un site web à fort trafic, donc MyISAM est requis pour des raisons de performance. – GetFree
ok, mais vous avez probablement besoin de le spécifier dans votre question .... – a1ex07
Aussi, je crois que vous pouvez avoir une table INNODB ... – a1ex07