我正在使用Postgres 9.5,似乎我错过了一些非常容易的东西,但我不能应用我的触发功能。
我有一个表list_items,其中包含列表和相应的项目及其位置,即:
-------------------------
id | list | item | pos (for position)
--------------------------
--------------------------list和item只是对应于它们自己表的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。
这是我的触发函数
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,将删除指定的行,但不应用触发器)
发布于 2016-10-18 18:55:12
你有两个触发器。第一个函数运行一个更新某些行的函数。第二个函数还运行一个更新某些行的函数。
每当行被更新时,第二个函数将被运行。
这包括由任一触发器更新行的时间。
从这个角度重新评估你的功能,看看这是否符合你所看到的。
此外,您可能会发现,提出通知是有用的,以显示每个函数正在做什么。
https://stackoverflow.com/questions/40109823
复制相似问题