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。
我正在尝试创建如下给定:
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。