我创建了这个触发器来更新 seq 列。我必须跟踪表中某些项目的顺序,但前提是责任类别 ID = 1,2。所以我的订购很棘手,因为任何具有责任类别 ID = 3 的项目我都不需要跟踪。
在我的触发器中,我正在查询以查找最后输入的 seq 编号(使用 max(seq)),然后转身并使用 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 都会重置排序。