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 :
J'ai cette erreur :
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
Pour information voici la table :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.
Et le trigger :
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;
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.
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
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
Partager