MySQL:设置为默认值的更新

7

当更新语句中未指定某一列的值时,是否可以将该列设置为其默认值(或任何指定的值)?我想可以通过触发器来实现。类似于:

IF ISNULL(NEW.column) THEN
 NEW.column = value
END IF;

无法运行。
2个回答

10

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

UPDATE tbl SET col = DEFAULT(col);

MySQL参考手册


那么你可以澄清问题。 - aksu
我在我的回答中这样做了。 - fancyPants

2

更新:

@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)

总之,请注意,这只是一个概念验证。我建议在应用程序层面解决这个问题,而不是在数据库层面。对我来说,在触发器中处理这个问题有点不太好。


谢谢,这正是我想表达的。但是,您的代码还会将列设置为默认值(如果指定),但与先前的值相同。 - Jan Traenkner
抱歉,我不明白问题出在哪里,请重新表述。如果您执行类似于update defvalue set id = 97, abc = 'new_value' where id = 3;的操作,则会设置new_value而不是默认值。 - fancyPants
假设您已经在表中有一个id=3的条目,abc='new_value',并且您执行了更新语句,那么abc将被设置为默认值(因为NEW.abc = OLD.abc),而不是'new_value'。 - Jan Traenkner
我认为那就是你要找的。你没有为列abc指定一个明确的值,因此它的值被重置为默认值。请用一些更新语句和所需结果来澄清你的问题。 - fancyPants
好的,我明白问题了。简单来说,这是不可能的。你必须在应用程序代码中捕获它。不管怎样,这是一个好主意,我的意思是,为什么你会有不同的更新语句呢?并且期望根据指定的列以及这些列具有的值而产生不同的行为,并试图在数据库层面上捕获这一点真的有点奇怪。尽管如此,由于我很好奇,我会再看一眼。 - fancyPants
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接