MySQL Trigger无法更新表 - 获取ERROR 1442

egi*_*dra 8 mysql

我有以下触发器:

CREATE TRIGGER sum
AFTER INSERT
ON news
FOR EACH ROW
UPDATE news SET NEW.sum = (NEW.int_views + NEW.ext_views)/NEW.pageviews
Run Code Online (Sandbox Code Playgroud)

它对表的列int_viewsext_views列进行求和,并将它们除以总页面浏览量.

每当我尝试向新闻添加新行时,我都会收到以下错误:

ERROR 1442 (HY000) at line 3: Can't update table 'news' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
Run Code Online (Sandbox Code Playgroud)

触发对我来说似乎很简单.触发器无法运行是否有原因?

Eug*_*eck 13

症状是,你正在运行UPDATE一个内部(所有行)INSERT触发-无论是修改表,这是不允许的.

也就是说,如果我猜错了你的触发器的意图,你不想更新所有行,只想更新新插入的行.你可以轻松实现这一目标

CREATE TRIGGER sum
BEFORE INSERT
ON news
FOR EACH ROW
SET NEW.sum = (NEW.int_views + NEW.ext_views)/NEW.pageviews
Run Code Online (Sandbox Code Playgroud)

请注意,这是一个BEFORE INSERT触发器,因为您希望在将行写入表之前更改该行.


小智 8

如果您尝试在导致触发器触发的同一个表上更新/插入,请不要使用常用sql命令

-> UPDATE TABLE_NAME SET COLUMN_NAME = VALUE WHERE CONDITION_LIST;  
-> INSERT INTO TABLE_NAME VALUES("VALUE1","VALUE2");
Run Code Online (Sandbox Code Playgroud)

这不行.仅使用set来指定您更新的列的值.

例:

CREATE TRIGGER trigger_name BEFORE/AFTER INSERT/UPDATE ON table_name
FOR EACH ROW
SET NEW.COLUMN_NAME = "VALUE";
Run Code Online (Sandbox Code Playgroud)