Postgresql 使用触发器更新行而不导致无限循环

Postgresql 使用触发器更新行而不导致无限循环,postgresql,triggers,postgresql-9.3,rule,Postgresql,Triggers,Postgresql 9.3,Rule,我有一个名为updated的列,它旨在显示该列上次被更改的时间 我的第一次尝试是创建一个触发器,将updated列更改为now()返回的值。但由于此触发器发生在更新事件上,因此会导致无限循环(更新更新的列会触发触发器) 我还尝试执行一个规则来实现类似的效果 我无法想象,当我调用和更新函数时,这是我在应用层被迫做的事情。那么,如何更新该行的更新列而不引起无限循环呢?我在其他应用程序中通过检查我正在更改的字段来解决这个问题,如果没有更改,那么我就不进行更新。如果可以检查更新的列,并且该列在最近N秒内

我有一个名为
updated
的列,它旨在显示该列上次被更改的时间

我的第一次尝试是创建一个触发器,将
updated
列更改为
now()
返回的值。但由于此触发器发生在更新事件上,因此会导致无限循环(更新更新的列会触发触发器)

我还尝试执行一个规则来实现类似的效果


我无法想象,当我调用和更新函数时,这是我在应用层被迫做的事情。那么,如何更新该行的更新列而不引起无限循环呢?

我在其他应用程序中通过检查我正在更改的字段来解决这个问题,如果没有更改,那么我就不进行更新。如果可以检查更新的列,并且该列在最近N秒内,则不要执行更新。这将停止无限循环。为N选择所需的数字,以便知道更新时间戳始终在N秒内。

使用如下触发器:

CREATE OR REPLACE FUNCTION update() RETURNS trigger AS $$
BEGIN
    IF NEW.updated = OLD.updated THEN
        NEW.updated = NOW()
    END IF;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER table_update
BEFORE UPDATE ON table
FOR EACH ROW EXECUTE PROCEDURE update()

这样,您就不在循环中了——您只更新了值一次(在执行更新之前),而且如果出于某种原因希望显式地设置
updated
(例如,在从备份导入旧数据时)。

为什么更改触发器中的列会导致无限循环?我不明白
new.some_column:=now()
怎么能做到这一点。我相信,因为触发器在更新时触发。因此,当更新我的_表集updated=now()时;在更新行时执行,这会导致更新触发器再次触发,并再次更新行,并在该循环中循环。如果可能重复,则不应在被“触发”的表上运行
update
,并且您首先不需要它。只需将新值赋给行即可。见Flimzy的答案。这确实是唯一正确的方法。没有冒犯,但这个回答给我的印象是,你在扳机上做了一些根本错误的事情。没有冒犯。我的答案是基于事件触发器的外部代码,而不是sql。这是解决这个问题的唯一办法。