gpt4 book ai didi

MySQL UPDATE BEFORE 触发谜题

转载 作者:行者123 更新时间:2023-11-29 09:02:59 25 4
gpt4 key购买 nike

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

感谢您的帮助!

最佳答案

好吧,我最终以不同的方式触发了这个触发器。不要纠结于尝试确定更新是否只是行数据的更改,还是仅 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

关于MySQL UPDATE BEFORE 触发谜题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8017656/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com