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

标签 mysql function triggers insert

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

相关文章:

MySQL余额计算-每次都单独的表或查询来计算?

mysql - 在 MySql 中更新表时验证行项目金额的触发器

MySQL 选择查找具有匹配名称列的类似纬度/经度

php - 使用用户名和密码字段中输入的任何内容进行脚本登录

python - 在 Python 中的列表上循环函数

javascript - 如何使函数立即调用,然后每 5000 毫秒调用一次

mysql - 在触发器中打印消息

MySql - 无法设置外键约束

mysql - 如何生成动态交叉表查询

PHP 字符串函数 chop() 没有给出所需的输出