2016-09-07 88 views
1

MySQL的V 5.6mysql的触发器:更新的列不属于不为空

您好,我有一个触发前更新问题:桌子上,我有一个标志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,作为选择(“” = 0)返回true,如果使用:

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

我旗从来没有明确设置为0。 NEW中没有列的更新不应为null?我能做什么,它是一个MySQL配置改变?

感谢

+2

'new'将包含行更新后的值(以及之前的'old'值)。如果你没有在你的查询中设置它,它会有它以前的值('new'不是你在更新查询中使用的列的列表)。您可以使用例如在你的更新查询中设置flag = 3作为你想在触发器中设置为0的标记。或者你可能想要改变你的逻辑,普通的更新标记是例如带'on update current_timestamp'的'timestamp'字段。 – Solarflare

+0

@Solarflare ha,设置一个假值,然后在rigger中设置为0似乎是这样做的:IF new.flag_indexation_required = 3 THEN set new。flag_indexation_required = 0; ELSE set new.flag_indexation_required = 1; END IF;你可以添加你的答案,所以我可以接受它吗? – jlb

回答

1

NEW包含该行将会有更新后,不只是你在更新查询明确使用了值的所有列的值。为了告诉触发器你想要显式地重置值,你可以使用一个不用的(但是有效的)值来标记该信息,然后在触发器中相应地进行操作,例如在你的触发器中,使用(假设签约TINYINT)

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

然后在你update查询,

update table set flag = -1; 

将其值设置为0,其他任何值,或者不使用在查询该列所有,将其设置为1

有没有触发器的替代和更常见的方法,其作用类似于你的国旗。您可以使用列

last_update datetime default null on update current_timestamp; 

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

update table set last_update = null; 

你的触发器方法当然会工作太完美。只要确保在某处记录该行为。