【问题标题】:Mysql trigger returns 1442 errorMysql触发器返回1442错误
【发布时间】:2017-08-12 09:40:31
【问题描述】:

我有带有order 属性的测试表。当order 更改它的值时,我需要重新计算表中的所有order 值。我有以下触发器:

DELIMITER $$

USE `testing`$$

DROP TRIGGER /*!50032 IF EXISTS */ `UpdateOrder`$$

CREATE
    /*!50017 DEFINER = 'root'@'localhost' */
    TRIGGER `UpdateOrder` AFTER UPDATE ON `upd_tst` 
    FOR EACH ROW BEGIN
    IF (OLD.order > NEW.order) THEN
        UPDATE `upd_tst` t SET t.`order` = t.`order` + 1 WHERE t.`order` < OLD.order AND t.`order` >= NEW.order AND t.id <> OLD.id;
    ELSEIF (OLD.order < NEW.order) THEN
        UPDATE `upd_tst` t SET t.`order` = t.`order` - 1 WHERE t.`order` > OLD.order AND t.`order` <= NEW.order AND t.id <> OLD.id;
    END IF;
    END;
$$

DELIMITER ;

当我尝试更新任何项目时,我收到 nex 错误:

Executed SQL Statement : update `testing`.`upd_tst` set `order`='3' where `id`='3' 
Error Number : 1442 
Error Message: Can't update table 'upd_tst' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. 

我该如何解决这个问题?我需要使用 ONLY 触发器。

在 postgresql 中,我可以在触发器 WHEN (pg_trigger_depth() = 0) 中使用此条件。 mysql中有这样的东西吗?

【问题讨论】:

  • 想想看,如果你有一个更新后的更新触发器,你就会有一个无限循环
  • 要么即时重新计算,要么使用另一个表进行重新计算
  • 我认为我可以在这种情况下避免无限循环`AND t.id OLD.id`

标签: mysql database triggers


【解决方案1】:

解决方案:将其设为BEFORE UPDATE ON 触发器 - 这样您就可以设置/更新触发器 SQL 中的字段值:

DELIMITER $$
USE `testing`$$
DROP TRIGGER /*!50032 IF EXISTS */ `UpdateOrder`$$
CREATE
    /*!50017 DEFINER = 'root'@'localhost' */
    TRIGGER `UpdateOrder` BEFORE UPDATE ON `upd_tst` 
    FOR EACH ROW BEGIN
    IF (OLD.order > NEW.order) THEN
        SET NEW.order = NEW.order` + 1;
    ELSEIF (OLD.order < NEW.order) THEN
        SET NEW.order = NEW.order - 1;
    END IF;
    END;
$$
DELIMITER ;

原因:您无法更新/删除/插入调用触发器的表:

在存储的函数或触发器中,不允许修改 已被(用于读取或写入)的表 调用函数或触发器的语句。

这样做会产生错误 1442:

Error Code: 1442
Can't update table 'MyTable' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

【讨论】:

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