Salut !

Je commence à faire des triggers sous MySQL5, et je rencontre un petit problème. Le voici :

J'ai une table, 3 colonnes, les 2 premières forment une clé unique
J'ai une trigger qui, lors d'un update, supprime les lignes où la 3e colonne est à 0 (zero)

Lorsque j'exécute cette requete :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
 UPDATE gp_unt SET unt_nb = 0 WHERE unt_iuntid = 1 AND unt_legid = 1
J'ai cette erreur :
err no.1442 : Can't update table 'gp_unt' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
Pour information voici la table :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
CREATE TABLE `gp_unt` (
  `unt_iuntid` tinyint(3) unsigned NOT NULL,
  `unt_legid` int(10) unsigned NOT NULL,
  `unt_nb` smallint(5) unsigned NOT NULL,
  PRIMARY KEY  (`unt_legid`,`unt_iuntid`),
  KEY `unt_nb` (`unt_nb`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Et le trigger :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
CREATE TRIGGER gp_unt_zeros AFTER UPDATE ON gp_unt FOR EACH ROW
DELETE FROM gp_unt WHERE NEW.unt_nb = 0
En fait j'avais déjà eu cette erreur sur un update concernant une ligne qui avait déjà un 0 à la 3e colonne (je sais ca ne devrait pas exister avec le trigger !). J'ai résolu en mettant NEW.unt_nb = 0 au lieu de simplement unt_nb = 0 dans la condition du delete.

Visiblement, il aime pas parce qu'il veut supprimer une ligne sur laquelle il est en train de travailler si j'ai bien compris. Mais comment lui dire qu'il doit quand même le supprimer ? Dans le trigger il y a bien "__AFTER__ UPDATE". Donc il devrait faire son update et ensuite le trigger, à savoir la suppression.
Je comprend pas trop le comportement de MySQL là.

Merci de m'éclairer !

PS : remplacez le "SET unt_nb = 0" par "SET unt_nb = unt_nb - 15" (où 15 est la valeur précédente de unt_nb, mais ca je le sais pas) pour comprendre pourquoi je ne fais pas un DELETE directement

PS2 : c'est mon unique trigger