背景:我们有一个默认为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();
答案 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();