2010-11-04 9 views
18

Je ne sais pas si c'est possible, mais j'ai une colonne nommée active dans un tableau. Chaque fois que la colonne active est modifiée, je voudrais réinitialiser la date dans la colonne date, mais SEULEMENT si la colonne active est modifiée.MySQL Trigger question: seulement déclencher quand une colonne est modifiée?

Si d'autres colonnes sont modifiées mais pas la colonne active, la date reste la même.

+0

avant la mise à jour nécessaire de vérifier l'ancienne valeur à la nouvelle valeur de colonne active, voir l'exemple dans http://www.java2s.com/Code/Oracle/Trigger/ReferenceoldandnewvaluebycolumninabeforeupdateTrigger.htm –

+0

http: // stackoverflow .com/questions/6296313/mysql-trigger-after-update-only-if-row-has-changed – zloctb

Répondre

27

quelque chose comme

DELIMITER // 
CREATE TRIGGER updtrigger BEFORE UPDATE ON mytable 
    FOR EACH ROW 
    BEGIN 
    IF NEW.active <> OLD.active THEN 
    SET NEW.date = '';  
    END IF; 
    END 
    // 
+0

Si je veux mettre à jour la date à la date actuelle, la ligne deviendrait 'SET NEW.date = CURDATE(); '? – kylex

+3

si vous voulez une date oui, si vous voulez la date + l'heure utilisez maintenant() –

+1

Si vous aviez ** activé = 1 ** alors que l'actif était déjà 1 dans la base de données, cela ne changerait-il pas? Je suppose que techniquement, parce que vous avez défini la colonne et dans la terminologie de la base de données, c'est un changement de colonne. Mais ** NEW.active n'est pas OLD.active ** vous donne seulement si NEW et OLD ont des valeurs différentes! Que ferez-vous dans ce cas? @HaimEvgi – edam

13

dans un problème Ran avec le test IF dans l'exemple # 2. Lorsque l'une des valeurs est null, le test <> renvoie null. Cela conduit à ce que le test ne soit pas satisfait et que l'action du déclencheur ne soit pas exécutée même si la valeur n'est pas nulle du tout. Pour résoudre ce problème, je suis arrivé avec ce test qui utilise < => (NULL-safe égal). J'espère que cela aide quelqu'un.

DELIMITER $$ 
DROP TRIGGER IF EXISTS updtrigger ; 
$$ 
CREATE TRIGGER updtrigger AFTER UPDATE 
    ON yourTable FOR EACH ROW 
BEGIN 
    IF ((NEW.active <=> OLD.active) = 0) THEN 
    SET NEW.date = '';  
    END IF; 
$$ 
+1

Vous pouvez simplement utiliser l'opérateur 'NOT' au lieu de comparer à zéro, comme dans la réponse suivante: http://stackoverflow.com/a/24041832/1419007. Sinon, bonne réponse. – user2428118