2010-11-04 10 views
18

Nie wiem, czy jest to możliwe, ale mam kolumnę o nazwie active w tabeli. Ilekroć aktywna kolumna zostanie zmieniona, chciałbym zresetować datę w kolumnie date, ale TYLKO, jeśli kolumna zostanie zmieniona.Pytanie dotyczące MySQL Trigger: wywołuje się tylko po zmianie kolumny?

Jeśli inne kolumny zostaną zmienione, ale nie kolumna active, data pozostanie taka sama.

+0

przed aktualizacji należy sprawdzić starą wartość na nową wartość aktywnej kolumny, patrz przykład w http://www.java2s.com/Code/Oracle/Trigger/ReferenceoldandnewvaluebycolumninabeforeupdateTrigger.htm –

+0

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

Odpowiedz

27

coś

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

Jeśli chcę zaktualizować datę do bieżącej daty, linia zmieni się na 'SET NEW.date = CURDATE(); '? – kylex

+3

jeśli chcesz podać datę tak, jeśli chcesz używać daty i czasu TERAZ() –

+1

Gdybyś miał ** ustawione aktywne = 1 **, gdy aktywny był już 1 w DB, to czy to nie byłaby zmiana? Podejrzewam, że technicznie, ponieważ ustawiłeś kolumnę i terminologię bazy danych, jest to zmiana kolumny. Ale ** NEW.active nie jest OLD.aktywny ** daje tylko wtedy, gdy NEW i OLD mają różne wartości! Co zrobisz w takim przypadku? @HaimEvgi – edam

13

Ran do problemu z testem IF na przykład # 2. Gdy jedna z wartości ma wartość null, test> < zwraca wartość null. Prowadzi to do tego, że test nie zostanie osiągnięty, a akcja wyzwalacza nie zostanie uruchomiona, nawet jeśli jedna wartość nie jest równa zeru. Aby to naprawić, wymyśliłem ten test, który używa < => (NULL-safe equal). Mam nadzieję, że to pomaga komuś.

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

Możesz po prostu użyć operatora 'NOT' zamiast porównywania do zera, jak w poniższej odpowiedzi: http://stackoverflow.com/a/24041832/1419007. W przeciwnym razie dobra odpowiedź. – user2428118

Powiązane problemy