2011-06-28 5 views
4

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.

Répondre

4

Vous ne pouvez pas ajouter une clé étrangère avec ON DELETE SET NULL (or DEFAULT)?
MISE À JOUR (DEFAULT est toujours pas mis en œuvre, SET NULL est la seule option ...)
Donc, vous aurez quelque chose comme

create table folder(
id int unsigned not null auto_increment PRIMARY KEY , 
name varchar(100) not null , 
parentId int unsigned null , 
FOREIGN KEY(parentId) REFERENCES folder(id) ON UPDATE CASCADE ON DELETE SET NULL  
) ; 
+0

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

+0

ok, mais vous avez probablement besoin de le spécifier dans votre question .... – a1ex07

+1

Aussi, je crois que vous pouvez avoir une table INNODB ... – a1ex07

Questions connexes