Mysql触发器返回1442错误

标签 mysql database triggers

我有一个带有 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 ;

当我尝试更新任何项目时,出现下一个错误:

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. 

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

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

最佳答案

解决方案:使其成为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 ;

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

Within a stored function or trigger, it is not permitted to modify a table that is already being used (for reading or writing) by the statement that invoked the function or trigger.

这样做会产生错误 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.

关于Mysql触发器返回1442错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42914985/

相关文章:

php - 我需要将数据库中的数据显示到下拉模式 CodeIgniter

MySQL - 选择值并按表名删除重复项

php - 仅在第一次单击时添加动态行

java - 事务是否收集对数据库的查询或锁定数据库直到提交?

mysql - 在插入 MySQL 之前触发生成唯一 ID

mysql - 有条件地从另一个表更新表字段

java - H2(文件)删除性能

php - 将数据库记录与上传文件夹中的图像相匹配

java - Quartz 中每 n 周的工作日 a 和 b 的 x 点执行一次作业

mysql - 如何在特定日期和时间触发 Mysql 触发器