2011-11-05 36 views
0

我有一個IsDirty列表,我想更新一行時爲「1」,但我也希望能夠明確地將IsDirty標誌設置回「0」。所以,我創建了一個觸發器:MySQL更新之前觸發益智遊戲

FOR EACH ROW 
BEGIN 

IF NEW.IsDirty = 0 AND OLD.IsDirty=1 THEN 
    SET NEW.IsDirty = 0; 
ELSE SET NEW.IsDirty = 1; 
END IF; 

END; 

有了這個觸發器,更新任何列IsDirty列設置爲1,而我也可以「UPDATE TABLE_NAME SET IsDirty = 0其中xxx = 123」 - 偉大工程轉IsDirty 「關」。但是如果我在一行中執行了兩次(「UPDATE table_name SET IsDirty = 0 WHERE xxx = 123」),它會再次將IsDirty設置爲1。再次做它,將其設置爲0.然後來回切換,每次切換。看着我的觸發器,我可以看到如何發生。所以我改成了這樣:

FOR EACH ROW 
BEGIN 

IF NEW.IsDirty = 0 AND OLD.IsDirty=1 THEN 
SET NEW.IsDirty = 0; 
ELSEIF NEW.IsDirty = 0 AND OLD.IsDirty=0 THEN 
SET NEW.IsDirty = 0; 
ELSE SET NEW.IsDirty = 1; 
END IF; 

但現在更新比IsDirty其他任何列不再設置IsDirty爲1來設置它的唯一方法1,現在是明確更新IsDirty列。

我在做什麼錯?我只想在列更新時打開IsDirty,並且能夠將其關閉,甚至連續兩次關閉。

感謝您的幫助!

回答

2

那麼,我最終做了這個觸發有點不同。而不是糾結於試圖確定更新是否只是該行數據的變化,而不是僅在IsDirty標誌的變化,與兩者都不與...

我結束了將要求更改爲:「如果要重置IsDirty標誌;即將其設置爲零 - 則在更新語句中將其設置爲-1」。所以它非常明確和清晰。

所以,現在的觸發看起來是這樣的:

BEGIN 
    SET NEW.EffectiveDate = current_timestamp; 
    IF NEW.IsDirty = -1 THEN 
    BEGIN 
     SET NEW.IsDirty = 0; 
    END; 
    ELSE 
    SET NEW.IsDirty = 1; 
    END IF; 
END  

而且想要重置IsDirty柱看起來像這個例子UPDATE語句:

UPDATE task_set SET IsDirty = -1 WHERE CategoryID = 20