插入数据后,例如将日期插入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 中完成。
您无法组合 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);
关于插入一行后触发更新两列的操作时Mysql错误1442,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39838235/