如果在语句中没有专门给出值,是否可以在更新时将列设置为其默认值(或任何指定值)?我认为触发器可能会实现这一点。像
这样的东西IF ISNULL(NEW.column) THEN
NEW.column = value
END IF;
没用。
答案 0 :(得分:2)
答案 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)
。
总而言之,请注意,这是一个概念验证。我建议在应用程序层解决这个问题,而不是数据库层。对我来说这个触发器对我来说似乎有点脏。