postgresql - 触发,更新字段更新的时间戳

时间:2015-06-30 20:20:54

标签: postgresql function triggers

背景:我们有一个默认为0的completed_flag,当一个人完成调查时,它会更新为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();

1 个答案:

答案 0 :(得分: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();