手动修改更新列值时HeidiSQL Before Update触发错误
HeidiSQL Before Update trigger error when manually modifying updated column value
BEGIN
SET NEW.value_result = NEW.value_a + NEW.value_b;
END
我想了解为什么如果我手动修改 value_result 列会显示以下错误:
MariaDB:错误
0 行本应为 1 时已更新。
如果我手动修改 value_a 或 value_b 列,则没有问题,并且 value_result 列已完美更新。但是,如果我“意外”修改了 value_result 列,则会显示错误。
这可以预防吗?手动我的意思是使用 HeidiSQL 界面而不是查询代码。
所有列都是 INT(11)
MySQL 和 MariaDB 只更新值发生变化的行。 Here 是 db<>fiddle.
中的一个例子
我怀疑这就是您遇到的问题。
如果你这样做:
update t
set value_a = 123
where id = ?;
然后(大概)value_a
和 value_result
都会改变。该行已更新。
如果你这样做:
update t
set value_result = 123
where id = ?;
然后触发器将 value_result
重置为旧值并且不会更改任何行。
注意:听起来您最好使用计算列而不是在触发器中设置值:
alter table t add value_result int as (value_a + value_b);
数据库甚至不允许您尝试为计算列赋值 -- 而且该值始终是正确的。
BEGIN
SET NEW.value_result = NEW.value_a + NEW.value_b;
END
我想了解为什么如果我手动修改 value_result 列会显示以下错误:
MariaDB:错误 0 行本应为 1 时已更新。
如果我手动修改 value_a 或 value_b 列,则没有问题,并且 value_result 列已完美更新。但是,如果我“意外”修改了 value_result 列,则会显示错误。
这可以预防吗?手动我的意思是使用 HeidiSQL 界面而不是查询代码。
所有列都是 INT(11)
MySQL 和 MariaDB 只更新值发生变化的行。 Here 是 db<>fiddle.
中的一个例子我怀疑这就是您遇到的问题。
如果你这样做:
update t
set value_a = 123
where id = ?;
然后(大概)value_a
和 value_result
都会改变。该行已更新。
如果你这样做:
update t
set value_result = 123
where id = ?;
然后触发器将 value_result
重置为旧值并且不会更改任何行。
注意:听起来您最好使用计算列而不是在触发器中设置值:
alter table t add value_result int as (value_a + value_b);
数据库甚至不允许您尝试为计算列赋值 -- 而且该值始终是正确的。