创建触发器以更新分类/订单栏 [英] Creating a trigger to update a sort/order column

查看:178
本文介绍了创建触发器以更新分类/订单栏的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我创建了这个触发器来更新seq列。我必须跟踪表中某些项目的顺序,但只有当liability_category_id = 1,2时才有效。所以我的订单是棘手的,因为任何与liability_category_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 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;

但是,当输入一个新项目时,出现以下错误:无法更新表格'stored_detail'在存储函数/触发器中,因为它已经被调用这个存储函数/触发器的语句所使用。

有没有更好的方法来控制这些项目的订购?我原先的想法是简单地设置第一个seq = 1,然后seq = 2等。虽然排序重置为每个新的analysis_id。

解决方案 div>

我认为解决方法是让它成为一个before触发器,并在插入之前更新插入自身的记录。

所以

  CREATE 
/ *!50017 DEFINER ='admin'@'%'* /
TRIGGER`trigger_liability_detail_after_insert`在插入之前`liability_detail `
对于每行开始
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;
$$

这是一个快速复制/粘贴,但它应该是沿着这些行。


I have created this trigger to update the seq column. I have to keep track of the order of certain items in the table, but only if the liability_category_id = 1,2. So my ordering is tricky because any item with a liability_category_id = 3 I don't need to track.

In my trigger, I'm querying to find the last entered seq number (using max(seq)), then turning around and updating the new entry with the 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 ;

However, when entering a new item, I get this error: Can't update table 'liability_detail' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

Is there a better way to control the ordering of these items? My original thought was to simply set the first seq = 1, then seq = 2, etc. The ordering is reset for each new analysis_id though.

解决方案

I think the workaround is to make this a before trigger and update the record being insert itself prior to insert.

So

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;
$$

That was a quick copy/paste, but it should be something along those lines.

这篇关于创建触发器以更新分类/订单栏的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆