mySQL8.0触发语句

时间:2019-08-05 03:22:20

标签: mysql sql database mysql-8.0

我正在尝试创建以下给定的内容:

  

在设置了以下内容的更新后,在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',因为调用该存储函数/触发器的语句已使用该表。

3 个答案:

答案 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