我已创建此触发器来更新seq列。我必须跟踪表中某些项目的顺序,但只有在liability_category_id = 1,2时才有效。所以我的订单很棘手,因为任何带有liability_category_id = 3的项目我都不需要跟踪。创建触发器以更新排序/排序列
在了扳机,我查询找到最后输入的序列号(使用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,排序都会重置。
以这种方式更新列可能会导致具有相同seq值的多个行,因为最大值可能在插入期间读取,但在另一个插入期间再次读取之前未更新。你应该使用自动增量来处理这个问题。 – 2012-07-16 17:23:42