gpt4 book ai didi

mysql触发器: column not part of the update is not null

转载 作者:行者123 更新时间:2023-11-28 23:25:52 25 4
gpt4 key购买 nike

MySQL V 5.6

您好,更新前的触发器有问题:在表上,我有一个标志 defiend 作为 tinyint,不为空,默认值为 1 。我有一个更新前触发器,只要行更新就将此标志设置为 1。但是,我还需要在一个过程中将标志显式设置为 0,所以我尝试了

create trigger t BEFORE UPDATE on table for each row
BEGIN
IF new.flag is NULL THEN
set new.flag = 1
END IF;

问题:new.flag 永远不会为 null。 检查

IF new.flag is NULL THEN  
set new.flag = 1
ELSEIF new.flag = 0 THEN
set new.flag = 3
END IF;

每当我更新表而不在更新查询中包含该标志时,将列设置为 3。更糟糕的是,我无法检查空字符串以将标志设置为 1,因为 select ('' = 0) 返回 true,如果使用:

IF new.flag is NULL OR new.flag = '' THEN  
set new.flag = 1
END IF;

我永远无法明确地将标志设置为 0 。在 NEW 中,不属于更新的列不应该为 null 吗?我能做什么,是要更改的 mysql 配置吗?

谢谢

最佳答案

NEW 包含更新后该行将具有的所有列的值,而不仅仅是您在更新查询中明确使用的值。

要告诉触发器您要显式重置该值,您可以使用其他未使用(但有效)的值来标记该信息,然后在触发器中执行相应操作,例如,在您的触发器中,使用(假设已签名微小的)

IF new.flag = -1 THEN  
set new.flag = 0;
ELSE
set new.flag = 1;
END IF;

然后在您的更新查询中,

update table set flag = -1;

会将值设置为 0,任何其他值,或者根本不在查询中使用该列,都会将其设置为 1

有一种更常见的替代方法,无需触发器,其工作方式与您的标志类似。您可以使用列

last_update datetime default null on update current_timestamp;
此列中的

nullflag = 0 具有相同的含义,任何其他值与 flag = 1 具有相同的含义.它们是自动设置的。如果你想重置你的“旗帜”,你可以简单地使用

update table set last_update = null;

您的触发方法当然会非常完美。只需确保在某处记录该行为即可。

关于mysql触发器: column not part of the update is not null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39366448/

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