Mysql错误1442在插入行后触发更新两列的操作

时间:2016-10-03 18:36:46

标签: mysql database-trigger

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

我的测试table有四列:

idevent_dateevent_quarterevent_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'在存储的函数/触发器中,因为它已被调用此存储的

的语句使用      

功能/触发器

我该如何解决?

然后看起来我必须制作两个触发器,一个用于此INSERT动作,另一个用于UPDATE动作。对?更新特定行或记录时会怎样?

或者是否可以触发更新和插入操作?

1 个答案:

答案 0 :(得分:1)

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

该行被称为new,您可以读取和写入该行,但您必须使用语法set new.columnname = ...,而不是update。这必须在before - 触发器中完成。

您无法合并updateinsert的触发器,因此您必须创建两个,但您可以对两者使用相同的代码:

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);