我有一个带有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,并且还能够将其关闭,甚至连续两次并让它保持关闭状态。
感谢您的帮助!
答案 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