mySQL8.0 触发语句

mySQL8.0 trigger statements

我正在尝试创建如下给定:

Create a trigger on the Company table after an update that sets a company's budget to 0 if it is less than 0.

但是我遇到了诸如无法更新、设置 table 等错误。我知道这是因为我需要从 'after update' 更改为 'before update'。但我不能忽略预期的代码。我能做什么?

我的 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 ;

Error: ER_CANT_UPDATE_USED_TABLE_IN_SF_OR_TRG: Can't update table 'Company' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

您无法更新已被触发器使用的整个 table,但您可以更新已修改的列。

假设您的 table 有主键 company_id

喜欢

update Company 
set budget = 0 
where company_id=new.company_id and budget < 0;

'In an UPDATE trigger, you can use OLD.col_name to refer to the columns of a row before it is updated and NEW.col_name to refer to the columns of the row after it is updated' - https://dev.mysql.com/doc/refman/8.0/en/trigger-syntax.html

前触发器可以工作,但我不确定是否适合使用触发器 - 您是否真的想在公司每次更新时都这样做(或仅在特定情况下),例如,如果您更改地址是否合适(假设地址在公司 table)

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 ;

这样的触发器在逻辑上应该在更新之前而不是之后完成:

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 ;

您可以将其表示为 after update 触发器:

create trigger after_company_update after update on Company 
for each row
    update Company
        set budget = 0
        where Company.Id = new.Id;

语法有效,但触发器无效。它 returns 错误:

Can't update table 'Company' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

你可以看到这个here