【问题标题】:postgresql - trigger, update timestamp on field updatepostgresql - 触发器,更新字段更新的时间戳
【发布时间】:2015-06-30 20:20:54
【问题描述】:

背景:我们有一个 completed_flag,默认为 0,当一个人完成调查时更新为 1。我想记录这次更新发生的时间戳

在编写此触发器/函数以在标志从 0 触发到 1 时更新时间戳之后,我质疑我是否以最好的方式做到了这一点。我怀疑这不是最好的方法,但我对 postgres 有点陌生。触发器只能在该值更改时调用该函数吗?这将消除每次 ROW 更新检查此值的需要,这似乎过多

-- add new column to store time the respondent completed
ALTER TABLE  tbl_pXXXX ADD COLUMN complete_time timestamp without time zone;


-- function to insert timestamp
CREATE FUNCTION completed_timestamp() RETURNS trigger AS $$
   LANGUAGE plpgsql
BEGIN
 IF new.complete_flag = 1 and old.completed_flag = 0
            THEN UPDATE tbl_pXXXX
            SET complete_time = current_timestamp
END;
$$;

-- trigger to call the function
CREATE TRIGGER update_timestamp
AFTER UPDATE ON tbl_pXXXX
FOR EACH ROW 
EXECUTE PROCEDURE completed_timestamp();

【问题讨论】:

    标签: postgresql function triggers


    【解决方案1】:

    只要您只更改触发触发器的行,使用BEFORE UPDATE 触发器就更简单(也更便宜),它可以在将new.complete_flag 保存到表之前对其进行更改,而不必在 UPDATE 语句已经存在之后运行它。

    您还可以使用CREATE TRIGGER 语句的UPDATE OF <column> 子句将触发器限制为更新特定字段。

    最终结果如下所示:

    CREATE FUNCTION completed_timestamp() RETURNS trigger AS $$
       LANGUAGE plpgsql
    BEGIN
      IF new.complete_flag = 1 and old.completed_flag = 0 THEN
        new.complete_time := current_timestamp;
      END IF;
      RETURN new;
    END;
    $$;
    
    CREATE TRIGGER update_timestamp
    BEFORE UPDATE OF completed_flag ON tbl_pXXXX
    FOR EACH ROW 
    EXECUTE PROCEDURE completed_timestamp();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-30
      • 2014-02-05
      • 1970-01-01
      • 1970-01-01
      • 2013-04-14
      • 1970-01-01
      • 2010-11-05
      • 1970-01-01
      相关资源
      最近更新 更多