2011-11-05 69 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