将数据(例如日期)插入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'在存储的函数/触发器中,因为它已被调用此存储的
的语句使用功能/触发器
我该如何解决?
然后看起来我必须制作两个触发器,一个用于此INSERT
动作,另一个用于UPDATE
动作。对?更新特定行或记录时会怎样?
或者是否可以触发更新和插入操作?
答案 0 :(得分:1)
在触发器中,您不能将要更改的表用于其他查询,这尤其意味着您无法更改或读取该表的其他行。但您实际上可以更改当前正在更新/插入的行。
该行被称为new
,您可以读取和写入该行,但您必须使用语法set new.columnname = ...
,而不是update
。这必须在before
- 触发器中完成。
您无法合并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);