当更新语句中未指定某一列的值时,是否可以将该列设置为其默认值(或任何指定的值)?我想可以通过触发器来实现。类似于:
IF ISNULL(NEW.column) THEN
NEW.column = value
END IF;
无法运行。
当更新语句中未指定某一列的值时,是否可以将该列设置为其默认值(或任何指定的值)?我想可以通过触发器来实现。类似于:
IF ISNULL(NEW.column) THEN
NEW.column = value
END IF;
更新:
@JanTraenkner 我所知道的是,这是不可能的。但是你可以在应用程序代码中确保所有列都在更新语句中提到,并且对于那些没有值的列,使用NULL
作为值。然后你的触发器代码几乎正确,你只需要将它改为
IF (NEW.column IS NULL) THEN
SET NEW.column = value
END IF;
原始答案:
我理解你的问题是:“如果我在更新语句中没有指定列(更新该表的其他列),则将列设置为默认值。”
使用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)
。
总之,请注意,这只是一个概念验证。我建议在应用程序层面解决这个问题,而不是在数据库层面。对我来说,在触发器中处理这个问题有点不太好。
update defvalue set id = 97, abc = 'new_value' where id = 3;
的操作,则会设置new_value
而不是默认值。 - fancyPants