Existe-t-il une possibilité d'utiliser un déclencheur "after update" uniquement dans le cas où les données ont été VRAIMENT modifiées. Je connais l'existence de "NEW et OLD". Mais lorsque je les utilise, je ne peux que comparer des colonnes. Par exemple "NEW.count <> OLD.count".
Mais je veux quelque chose comme : lancer le déclencheur si "NEW <> OLD"
Un exemple :
create table foo (a INT, b INT);
create table bar (a INT, b INT);
INSERT INTO foo VALUES(1,1);
INSERT INTO foo VALUES(2,2);
INSERT INTO foo VALUES(3,3);
CREATE TRIGGER ins_sum
AFTER UPDATE ON foo
FOR EACH ROW
INSERT INTO bar VALUES(NEW.a, NEW.b);
UPDATE foo SET b = 3 WHERE a=3;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1 Changed: 0 Warnings: 0
select * from bar;
+------+------+
| a | b |
+------+------+
| 3 | 3 |
+------+------+
Le fait est qu'il y a eu une mise à jour, mais rien n'a changé . Mais la gâchette a quand même fonctionné. IMHO il devrait y avoir un moyen de ne pas le faire.
Je sais que j'aurais pu utiliser
SI NOW.b <> OLD.b
pour cet exemple.
MAIS imaginez un grand tableau dont les colonnes changent. Vous devez comparer chaque colonne et si la base de données change, vous devez ajuster le déclencheur. Et ce n'est pas très agréable de comparer chaque colonne de la ligne codée en dur :)
Addition
Comme vous pouvez le voir sur la ligne
Rangs assortis : 1 Modifié : 0 Avertissements : 0
MySQL sait que la ligne n'a pas changé. Mais il ne partage pas cette connaissance avec le déclencheur. Un déclencheur comme "AFTER REAL UPDATE" ou quelque chose comme ça serait cool.