首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重新排序未应用的唯一列的触发器函数。

重新排序未应用的唯一列的触发器函数。
EN

Stack Overflow用户
提问于 2016-10-18 13:36:27
回答 1查看 63关注 0票数 0

我正在使用Postgres 9.5,似乎我错过了一些非常容易的东西,但我不能应用我的触发功能。

我有一个表list_items,其中包含列表和相应的项目及其位置,即:

代码语言:javascript
复制
-------------------------
id | list | item | pos (for position) 
--------------------------
--------------------------

listitem只是对应于它们自己表的is的外键,id只是一个串行的主键。

位置pos对于与某些列表相对应的项(即唯一的(列表、项、pos))是唯一的。

用户可能会更改或删除列表中某些项目的位置,我需要一个触发器,以便在更新或删除时重新排序所有其他受影响项目的位置。

例如,如果列表L有6个具有pos从1到6的项,如果删除其pos =3的项,则需要重新排序L中项目的'pos‘,使其从4-6变为3-5;如果使用UPDATE将exmaple的pos从5更改为3,则需要重新排序条目3、4成为4、5。

这是我的触发函数

代码语言:javascript
复制
CREATE OR REPLACE FUNCTION reorder_delete() RETURNS trigger AS $$
DECLARE rw RECORD;
BEGIN
    FOR rw IN SELECT * FROM list_items WHERE list = OLD.list AND pos > OLD.pos
    LOOP
        UPDATE list_items SET pos = rw.pos - 1 WHERE id = rw.id;
    END LOOP;
    RETURN NULL;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER do_reorder_delete
    AFTER DELETE ON list_items
    FOR EACH ROW
    EXECUTE PROCEDURE reorder_delete();


CREATE OR REPLACE FUNCTION reorder_update() RETURNS trigger AS $$
DECLARE rw RECORD;
BEGIN
    FOR rw IN SELECT * FROM list_items WHERE list = NEW.list AND pos >= NEW.pos ORDER BY pos DESC
    LOOP
        UPDATE list_items SET pos = rw.pos + 1 WHERE id = rw.id;
    END LOOP;
    RETURN NULL;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER do_reorder_update
    BEFORE UPDATE ON list_items
    FOR EACH ROW
    EXECUTE PROCEDURE reorder_update();

问题是,每当我做更新或删除操作,什么都不会发生!(对于DELETE,将删除指定的行,但不应用触发器)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-18 18:55:12

你有两个触发器。第一个函数运行一个更新某些行的函数。第二个函数还运行一个更新某些行的函数。

每当行被更新时,第二个函数将被运行。

这包括由任一触发器更新行的时间。

从这个角度重新评估你的功能,看看这是否符合你所看到的。

此外,您可能会发现,提出通知是有用的,以显示每个函数正在做什么。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40109823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档