2010-11-04 3 views
18

Non so se è possibile, ma ho una colonna denominata active in una tabella. Ogni volta che la colonna attiva viene modificata, desidero reimpostare la data nella colonna date, ma SOLO se la colonna active viene modificata.Domanda MySQL Trigger: solo trigger quando una colonna viene cambiata?

Se altre colonne vengono modificate ma non la colonna active, la data rimane la stessa.

+0

prima dell'aggiornamento bisogno di controllare il valore vecchio al nuovo valore della colonna attiva, vedi esempio in 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

risposta

27

qualcosa come

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

Se voglio aggiornare la data alla data corrente la riga cambierà in 'SET NEW.date = CURDATE(); '? – kylex

+3

se si desidera la data sì, se si desidera che data + ora utilizzi NOW() –

+1

Se si fosse ** impostato attivo = 1 ** mentre attivo era già 1 nel DB, non sarebbe una modifica? Suppongo che tecnicamente sarebbe, perché hai impostato la colonna e nella terminologia del database è un cambiamento di colonna. Ma ** NEW.active non è OLD.active ** ti dà solo se NEW e OLD avevano valori diversi! Cosa farai in quel caso? @HaimEvgi – edam

13

imbattuto in un problema con il saggio IF nell'esempio # 2. Quando uno dei valori è nullo, il test < restituisce null. Questo porta al test che non viene raggiunto e l'azione del trigger non viene eseguita anche se il valore uno non è affatto nullo. Per risolvere questo problema sono arrivato con questo test che utilizza < => (NULL-safe equal). Spero che questo aiuti qualcuno fuori.

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

È possibile utilizzare semplicemente l'operatore 'NOT' anziché confrontare a zero, come nella seguente risposta: http://stackoverflow.com/a/24041832/1419007. Altrimenti, buona risposta. – user2428118