MySQL:在更新时设置为默认值

时间:2014-01-05 20:08:50

标签: mysql

如果在语句中没有专门给出值,是否可以在更新时将列设置为其默认值(或任何指定值)?我认为触发器可能会实现这一点。像

这样的东西
IF ISNULL(NEW.column) THEN
 NEW.column = value
END IF;

没用。

2 个答案:

答案 0 :(得分:2)

MySQL有一个名为DEFAULT()的函数,它从指定的列中获取默认值。

UPDATE tbl SET col = DEFAULT(col);

MySQL Reference

答案 1 :(得分:1)

<强>更新

@JanTraenkner据我所知,这是不可能的。但是,您可以在应用程序代码中确保更新语句中提到了所有列,对于那些没有值的列,您可以使用NULL作为值。然后你的触发器代码几乎是正确的,你只需要将它改为

IF (NEW.column IS NULL) THEN
 SET NEW.column = value
END IF;

原始回答:

我理解你的问题,“将列设置为默认值,如果我没有在update语句中指定列(更新该表中的其他列)”。

使用ISNULL()col IS NULL进行检查在此处不起作用,因为当您未在更新语句中指定它时,它根本就不存在。没有什么可以检查的。

我写了这个小例子脚本,让它像我理解的那样工作。

drop table if exists defvalue;
create table defvalue (id int auto_increment primary key, abc varchar(255) default 'default');
insert into defvalue (id) values (null);
insert into defvalue (id, abc) values (null, 'not_default_value');
insert into defvalue (id, abc) values (null, 'another_not_default_value');

drop trigger if exists t_defval;
delimiter $$
create trigger t_defval before update on defvalue
for each row
begin
set @my_def_value = (select default(abc) from defvalue limit 1);
if (new.abc = old.abc) then
set new.abc = @my_def_value;
end if;
end $$
delimiter ;

select * from defvalue;

update defvalue set id = 99 where id = 1;

select * from defvalue;

update defvalue set id = 98 where id = 2;

select * from defvalue;

我还必须首先在变量中保存列的默认值,因为函数需要知道从哪个表中。不幸的是,人们不能将其指定为参数,甚至不能指定为default(tablename.column)

总而言之,请注意,这是一个概念验证。我建议在应用程序层解决这个问题,而不是数据库层。对我来说这个触发器对我来说似乎有点脏。