11

我有以下触发器:

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

int_views它将表格的和列相加,ext_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.

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

4

3 回答 3

19

症状是,您正在触发器内运行UPDATE(对于所有行)INSERT- 两者都修改表,这是不允许的。

也就是说,如果我猜对了您的触发器的意图,您不想更新所有行,而只想更新新插入的行。您可以通过以下方式轻松实现

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

请注意,这是一个BEFORE INSERT触发器,因为您想在将行写入表之前对其进行更改。

于 2012-08-30T19:22:39.670 回答
9

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

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

这行不通。仅使用 set 来分配您更新的列的值。

例子:

CREATE TRIGGER trigger_name BEFORE/AFTER INSERT/UPDATE ON table_name
FOR EACH ROW
SET NEW.COLUMN_NAME = "VALUE";
于 2014-12-22T08:54:05.760 回答
0

我处于类似的情况,我必须运行两个触发器:

  1. 更新插入新行的 3 个字段
  2. 更新行上的更新 3 个字段

经过大量的努力,我终于能够用以下方式编写TRIGGER:

FOR 更新 INSERT 上的值

CREATE TRIGGER `INSERT_DISCOUNT_SERVICES` BEFORE INSERT ON `services`
FOR EACH ROW SET 
NEW.discount_5_rate = (NEW.ndis_rate*0.05),
NEW.discount_10_rate=(NEW.ndis_rate*0.10),
NEW.discount_15_rate=(NEW.ndis_rate*0.15)

相似地

FOR 在 UPDATE 上更新值

CREATE TRIGGER `UPDATE_DISCOUNTS_SERVICES` BEFORE UPDATE ON `services`
FOR EACH ROW SET 
NEW.discount_5_rate = (NEW.ndis_rate*0.05), 
NEW.discount_10_rate=(NEW.ndis_rate*0.10),
NEW.discount_15_rate=(NEW.ndis_rate*0.15)
于 2019-08-01T11:38:57.370 回答