【问题标题】:Mysql error 1442 when triggering an action to update two columns after inserting a row插入行后触发更新两列的操作时Mysql报错1442
【发布时间】:2016-10-03 18:36:46
【问题描述】:

在将数据(例如,日期)插入event_date 列后,我想要一个触发器来更新同一个表的两列,并将“event_quarter”和“event_year”的对应值排成一行。

我有这个测试table 有四列:

id、event_date、event_quarter、event_year

我一直在努力使用此代码以使其正常工作:

DELIMITER $$

CREATE TRIGGER `fill_event_quarter_and_year`
   AFTER INSERT
   ON `test_table`
   FOR EACH ROW
BEGIN
   DECLARE event_date_   DATE;

   SELECT event_date
     INTO event_date_
     FROM `test_table`
    WHERE NEW.id = id;

   UPDATE `test_table`
      SET event_quarter = QUARTER(event_date_), event_year = YEAR(event_date_)
    WHERE NEW.id = id;
END
$$  

但是,我收到以下错误:

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

函数/触发器

我该如何解决?

然后看起来我必须创建两个触发器,一个用于此INSERTing 操作,另一个用于UPDATEing 操作。正确的?更新特定行或记录时会怎样?

或者是否有可能同时触发更新和插入操作?

【问题讨论】:

    标签: mysql database-trigger


    【解决方案1】:

    在触发器中,您不能将要更改的表用于另一个查询,这尤其意味着您不能更改或读取该表的其他行。但您实际上可以更改当前正在更新/插入的行。

    该行称为new,您可以对其进行读写,但您必须使用语法set new.columnname = ...,而不使用update。这必须在before-trigger 中完成。

    您不能组合update 和insert 的触发器,因此您必须创建两个,但您可以对两者使用相同的代码:

    CREATE TRIGGER `trbins_fill_event_quarter_and_year`
    BEFORE INSERT ON `test_table`
    FOR EACH ROW
      set new.event_quarter = QUARTER(new.event_date), 
          new.event_year = YEAR(new.event_date);
    
    CREATE TRIGGER `trbupd_fill_event_quarter_and_year`
    BEFORE UPDATE ON `test_table`
    FOR EACH ROW
      set new.event_quarter = QUARTER(new.event_date), 
          new.event_year = YEAR(new.event_date);
    

    【讨论】:

      猜你喜欢
      • 2019-11-15
      • 1970-01-01
      • 2016-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-09
      • 2022-12-01
      • 1970-01-01
      相关资源
      最近更新 更多