【问题标题】:mySQL8.0 trigger statementsmySQL8.0 触发语句
【发布时间】:2019-12-12 13:52:41
【问题描述】:

我正在尝试按以下方式创建:

更新后在 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:无法更新存储函数/触发器中的表“公司”,因为它已被调用此存储函数/触发器的语句使用。

【问题讨论】:

  • 顺便说一句,为什么drop procedure if exists after_company_update 程序被删除了?不应该是trigger

标签: mysql sql database mysql-8.0


【解决方案1】:

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

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;

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

无法更新存储函数/触发器中的表“公司”,因为它已被调用此存储函数/触发器的语句使用。

你可以看到这个here

【讨论】:

  • 我同意这在逻辑上不可能更改发生触发器的同一张表上的值(表被锁定)。我确实按照这个联系了教练,希望能得到解决。
【解决方案2】:

'在 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 ;

【讨论】:

    【解决方案3】:

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

    假设您的表的主键是company_id

    喜欢

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-07
      • 2014-03-15
      • 2021-02-25
      • 1970-01-01
      • 1970-01-01
      • 2017-07-20
      • 2017-09-20
      相关资源
      最近更新 更多