2010-11-04 54 views
18

我不知道這是否可能,但我在表格中有一列名爲active的列。每當活動列被更改時,我想重置date列中的日期,但只有如果active列被更改。MySQL觸發問題:只有在列更改時觸發?

如果其他列被更改但不是active列,那麼日期將保持不變。

+0

更新前需要檢查舊值到活動列的新值,見例如http://www.java2s.com/Code/Oracle/Trigger/ReferenceoldandnewvaluebycolumninabeforeupdateTrigger.htm – 2010-11-04 15:06:54

+0

的http://計算器.com/questions/6296313/mysql-trigger-after-update-only-if-row-has-changed – zloctb 2014-11-20 11:07:02

回答

27

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

如果我想將日期更新爲當前日期,那麼該行會更改爲'SET NEW.date = CURDATE(); '? – kylex 2010-11-04 15:56:44

+3

如果你想要的日期是,如果你想日期+時間使用NOW() – 2010-11-05 11:49:31

+1

如果你設置活動= 1 **而活動已經在數據庫中1,那麼這不會是一個改變?我想在技術上它會,因爲你已經設置了列和數據庫術語這是一個列更改。但** NEW.active不是OLD.active **只有在NEW和OLD具有不同的值時才提供給您!在這種情況下你會做什麼? @HaimEvgi – edam 2015-08-12 04:50:52

13

陶然成在#2示例中的IF測試的問題。當其中一個值爲空時,<>測試返回null。這導致測試沒有得到滿足,即使一個值完全不等於null,觸發器的操作也不會運行。爲了解決這個問題,我想出了這個使用< =>(NULL-safe equal)的測試。希望這可以幫助別人。

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

您可以簡單地使用'NOT'運算符而不是比較爲零,如下面的答案:http://stackoverflow.com/a/24041832/1419007。否則,很好的答案。 – user2428118 2014-06-06 08:19:21