我有一个表,其中有一个名为priority的列。我创建了一个在更新后触发的触发器函数。我希望该函数更改其余行的优先级列的值。例如,我有10行,每行都有一个从1到10的值,然后我想要将第10行的优先级更改为1,然后将其余行的优先级加1。
我试图以多种方式更改查询,并在函数中添加更多/更少的逻辑,但我被卡住了。
CREATE FUNCTION reorder_priority() RETURNS TRIGGER AS $$
BEGIN
CASE TG_OP
WHEN 'UPDATE' THEN
UPDATE
link
SET
priority = priority + 1
WHERE
link.priority >= NEW.priority AND
NOT link.priority > OLD.priority;
END CASE;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
这个函数能够做到这一点,但它似乎触发了两次,每一行再加1,剩下10行,但优先级在2-11之间。
发布于 2019-08-17 08:55:22
我想通了..。
只需更改比较以排除更新OLD.priority的值,返回NEW,并将触发器更改为在之前运行而不是在之后运行
BEGIN
CASE TG_OP
WHEN 'UPDATE' THEN
UPDATE
link
SET
priority = priority + 1
WHERE
link.priority >= NEW.priority AND
NOT link.priority >= OLD.priority;
END CASE;
RETURN NEW;
END;
https://stackoverflow.com/questions/57532400
复制相似问题