我创建了这个触发器来更新 seq 列。我必须跟踪表中某些项目的顺序,但前提是 liability_category_id = 1,2。所以我的订购很棘手,因为我不需要跟踪 liability_category_id = 3 的任何项目。
在我的触发器中,我查询找到最后输入的序列号(使用 max(seq)),然后转身并使用序列 + 1 更新新条目。
DELIMITER $$
USE `analysisdb`$$
DROP TRIGGER /*!50032 IF EXISTS */ `trigger_liability_detail_after_insert`$$
CREATE
/*!50017 DEFINER = 'admin'@'%' */
TRIGGER `trigger_liability_detail_after_insert` AFTER INSERT ON `liability_detail`
FOR EACH ROW BEGIN
DECLARE SortOrder INT;
IF NEW.liability_category_id = 1 OR NEW.liability_category_id = 2 THEN
SET SortOrder = (SELECT MAX(seq) FROM liability_detail WHERE analysis_id = new.analysis_id AND liability_category_id IN (1, 2));
UPDATE liability_detail SET seq = (SortOrder + 1) WHERE id = NEW.id;
END IF;
END;
$$
DELIMITER ;
但是,当输入新项目时,出现此错误:无法更新存储函数/触发器中的表“liability_detail”,因为它已被调用此存储函数/触发器的语句使用。
有没有更好的方法来控制这些项目的顺序?我最初的想法是简单地设置第一个 seq = 1,然后设置 seq = 2,等等。不过,每个新的 analysis_id 都会重置顺序。
最佳答案
我认为解决方法是使它成为一个前置触发器,并在插入之前更新正在插入的记录。
所以
CREATE
/*!50017 DEFINER = 'admin'@'%' */
TRIGGER `trigger_liability_detail_after_insert` BEFORE INSERT ON `liability_detail`
FOR EACH ROW BEGIN
DECLARE SortOrder INT;
IF NEW.liability_category_id = 1 OR NEW.liability_category_id = 2 THEN
SET NEW.seq = 1 + IFNULL((SELECT MAX(seq) FROM liability_detail WHERE analysis_id = new.analysis_id AND liability_category_id IN (1, 2)), 0);
END IF;
END;
$$
那是一个快速的复制/粘贴,但应该符合这些思路。
关于mysql - 创建触发器以更新排序/顺序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11507758/