MySQL UPDATE BEFORE触发益智游戏

时间:2011-11-05 02:04:59

标签: mysql triggers

我有一个带有IsDirty列的表,当一行更新时我想要为“1”,但我也希望能够明确地将IsDirty标志设置回“0”。所以我创建了一个触发器:

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 WHERE 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,并且还能够将其关闭,甚至连续两次并让它保持关闭状态。

感谢您的帮助!

1 个答案:

答案 0 :(得分: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