我正在努力创造以下情况:
在更新后在“公司”表上创建一个触发器,如果该更新将公司的预算设置为0,如果该预算小于0。
但是,我与诸如无法更新、设置表等错误作斗争。我知道这是因为我需要从“更新后”改为“更新前”。但我不能忽视预期的代码。我能做什么?
我拥有的mySQL代码是:
delimiter $$
drop procedure if exists after_company_update $$
create trigger after_company_update after update on Company
for each row begin
update Company set budget = 0 where budget < 0;
end $$
delimiter ;错误: ER_CANT_UPDATE_USED_TABLE_IN_SF_OR_TRG:无法更新存储函数/触发器中的表'Company‘,因为它已经被调用此存储函数/触发器的语句所使用。
发布于 2019-08-05 11:53:14
这种触发应该在更新之前进行,而不是在更新之后进行:
delimiter $$
drop trigger if exists before_company_update $$
create trigger before_company_update after update on Company
for each row
begin
if old.budget < 0 then
set new.budget := 0
end if;
end $$
delimiter ;您可以将其表示为“update后触发器”:
create trigger after_company_update after update on Company
for each row
update Company
set budget = 0
where Company.Id = new.Id;语法有效,但触发器不起作用。它返回错误:
无法更新存储函数/触发器中的表“Company”,因为它已经被调用此存储函数/触发器的语句所使用。
你可以看到这个这里。
发布于 2019-08-05 06:08:47
不能更新触发器已经使用的整个表,但可以更新已被修改的列。
假设您的表有主键,即company_id
类
update Company
set budget = 0
where company_id=new.company_id and budget < 0;发布于 2019-08-05 06:22:53
‘在更新触发器中,可以在行更新之前使用OLD.col_name引用行的列,在行更新后使用NEW.col_name引用行的列’- https://dev.mysql.com/doc/refman/8.0/en/trigger-syntax.html
以前的触发器可以工作,但我不确定是否应该有一个触发器--您真的想在每次公司发生更新时(或者仅在特定的情况下)这样做吗?例如,如果您更改了地址(假设地址在公司表中),是否合适?
delimiter $$
drop trigger if exists after_company_update $$
create trigger after_company_update BEFORE update on Company
for each row begin
set NEW.budget = 0 where OLD.budget < 0;
end $$
DELIMITER ;https://stackoverflow.com/questions/57351834
复制相似问题