2010-11-04 7 views
18

No sé si esto es posible, pero tengo una columna llamada active en una tabla. Cada vez que se cambia la columna activa, me gustaría restablecer la fecha en la columna date, pero SOLO si se cambia la columna active.MySQL Pregunta de activación: ¿solo se activa cuando se cambia una columna?

Si se cambian otras columnas pero no la columna active, la fecha se mantendrá igual.

+0

antes de la actualización necesita para comprobar el valor antiguo al nuevo valor de la columna activa, véase el ejemplo de 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

Respuesta

27

algo así como

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 deseo actualizar la fecha a la fecha actual, la línea cambiará a 'SET NEW.date = CURDATE(); ¿? – kylex

+3

si quieres la fecha sí, si quieres usar la fecha + hora AHORA() –

+1

Si ** activas = 1 ** mientras que el activo ya era 1 en la base de datos, ¿no sería eso un cambio? Supongo que técnicamente sería así, porque has configurado la columna y en la terminología de la base de datos es un cambio de columna. ¡Pero ** NEW.active no es OLD.active ** le ofrece solo si NEW y OLD tenían valores diferentes! ¿Qué vas a hacer en ese caso? @HaimEvgi – edam

13

se topó con un problema con la prueba si en el ejemplo # 2. Cuando uno de los valores es nulo, la prueba <> devuelve nulo. Esto lleva a que la prueba no se cumpla y la acción del disparador no se ejecutará aunque el valor no sea nulo en absoluto. Para solucionar esto, se me ocurrió esta prueba que usa < => (igual a NULL-safe). Espero que esto ayude a alguien.

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

Puede simplemente usar el operador 'NOT' en lugar de comparar con cero, como en la siguiente respuesta: http://stackoverflow.com/a/24041832/1419007. De lo contrario, buena respuesta. – user2428118

Cuestiones relacionadas