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

标签 mysql database-trigger

插入数据后,例如将日期插入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 - Can't update table 'test_table' in stored function / trigger because it is already used by statement which invoked this stored

function / trigger

如何修复它?

那么看起来我必须创建两个触发器,一个用于此 INSERT ing 操作和 UPDATE 的另一个操作ing 行动。正确的?更新特定行或记录时会怎么样?

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

最佳答案

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

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

您无法组合 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);

关于插入一行后触发更新两列的操作时Mysql错误1442,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39838235/

相关文章:

创建触发器时或附近的 PostgreSQL 语法错误

mysql - 在 mysql 触发器中,有没有办法知道哪一列正在更新?

php - 将最后添加的条目从一个表插入到另一个表中

java - 使用 MySQL 触发器调用 Java 方法

postgresql - 检测更新不会更改行的触发器

mysql - 未知的系统变量 : "new.id" is not recognized

javascript - 具有限制 dinamis 的 jquery 复选框

mysql db 的 Python 结果与实际值不匹配 : comparison of values

php - 如何使用 foreach 进行连续的 mysql 插入?

mysql - 将列中的所有文本转换为 MySql 中的驼峰式大小写