我必须更新大约28天的记录:我需要从记录中删除一些数据而不实际删除记录本身。我已决定用触发器执行此操作,如下所示:
CREATE
FUNCTION my_table_update_old_data()
RETURNS TRIGGER LANGUAGE plpgsql AS
$$
BEGIN
UPDATE my_table
SET identity = NULL, comment = NULL
WHERE
created_at < NOW()- INTERVAL '28 DAYS';
RETURN NEW;
END;
$$;
CREATE
TRIGGER my_table_update_old_data_trigger
AFTER INSERT ON my_table
EXECUTE PROCEDURE my_table_update_old_data();
这很好(在我的测试中)但是我对AFTER INSERT
机制有一些担忧。有问题的表my_table
每小时更新一次;记录是从另一个临时表中批量插入的,如下所示(简化):
INSERT INTO my_table
SELECT DISTINCT ON (1)
temp.table.id
temp_table.identity,
temp_table.comment
FROM temp_table
ON CONFLICT DO NOTHING;
触发器会在批量插入后执行ONCE,还是在EACH记录插入时执行?这种方法有任何其他问题吗?
答案 0 :(得分:1)
每一行 对于每个声明
这指定是否应该对受触发事件影响的每一行触发一次触发器过程,或者每个SQL语句只触发一次。如果两者都未指定,则FOR EACH STATEMENT是默认值。
触发器声明中没有FOR EACH
子句,默认情况下为FOR EACH STATEMENT
。
您应该为UPDATE
语句添加一个附加条件,这样它就不会更新已经为空的行:
UPDATE my_table
SET identity = NULL, comment = NULL
WHERE
created_at < NOW()- INTERVAL '28 DAYS'
AND
identity IS NOT NULL;