gpt4 book ai didi

mysql - 创建触发器以更新排序/顺序列

转载 作者:行者123 更新时间:2023-11-29 06:58:12 25 4
gpt4 key购买 nike

我创建了这个触发器来更新 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com