【发布时间】: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`