我正在尝试创建以下给定的内容:
在设置了以下内容的更新后,在Company表上创建触发器 如果公司的预算小于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',因为调用该存储函数/触发器的语句已使用该表。
答案 0 :(得分:0)
您无法更新触发器已使用的整个表,但可以更新已修改的列。
假设您的表的主键为A
赞
company_id
答案 1 :(得分:0)
'在UPDATE触发器中,您可以使用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 ;
答案 2 :(得分:0)
在逻辑上,应该在更新之前 而不是之后进行此类触发:
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',因为调用该存储函数/触发器的语句已使用该表。
您可以看到此here。