【问题标题】:MySQL Trigger cannot update table - getting ERROR 1442MySQL 触发器无法更新表 - 获取错误 1442
【发布时间】:2022-12-01 08:27:29
【问题描述】:

我有以下触发器:

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

它将表格的 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.

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

【问题讨论】:

  • @jcho360,抱歉,我没有看到在哪里包含 where 条件。我希望触发器在插入后在每一行上执行。
  • 如果那不起作用让我知道最后尝试使用WHERE news_id = NEW.news_id;

标签: mysql


【解决方案1】:

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

也就是说,如果我猜对了你触发的意图,你不想更新全部行,但只有新插入的行。您可以轻松实现这一目标

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

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

【讨论】:

  • 对我来说同样的问题,只需要删除 UPDATE tlb 部分 - 谢谢!
【解决方案2】:

如果您尝试更新/插入导致触发器触发的同一个表,请不要使用常见的 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";

【讨论】:

  • 这是一个明智而合理的回应。它帮助我适当地解决了错误。谢谢!
【解决方案3】:

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

  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)
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-15
    • 2017-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    相关资源
    最近更新 更多