75 votes

MySQL Trigger après une mise à jour seulement si la ligne a été modifiée

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.

1voto

Hawthorne Points 111

Utilisez la requête suivante pour voir quelles lignes ont été modifiées :

(select * from inserted) except (select * from deleted)

Les résultats de cette requête devraient être constitués de tous les nouveaux enregistrements qui sont différents des anciens.

0voto

Herwin Rey Points 1
MYSQL TRIGGER BEFORE UPDATE IF OLD.a<>NEW.b

USE `pdvsa_ent_aycg`;

DELIMITER $$

CREATE TRIGGER `cisterna_BUPD` BEFORE UPDATE ON `cisterna` FOR EACH ROW

BEGIN

IF OLD.id_cisterna_estado<>NEW.id_cisterna_estado OR OLD.observacion_cisterna_estado<>NEW.observacion_cisterna_estado OR OLD.fecha_cisterna_estado<>NEW.fecha_cisterna_estado

    THEN 

        INSERT INTO cisterna_estado_modificaciones(nro_cisterna_estado, id_cisterna_estado, observacion_cisterna_estado, fecha_cisterna_estado) values (NULL, OLD.id_cisterna_estado, OLD.observacion_cisterna_estado, OLD.fecha_cisterna_estado); 

    END IF;

END

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X