使用插入触发器为使用批量插入的表更新旧记录

时间:2018-04-06 11:55:32

标签: postgresql triggers

我必须更新大约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记录插入时执行?这种方法有任何其他问题吗?

1 个答案:

答案 0 :(得分:1)

来自the documentation:

  

每一行   对于每个声明

     

这指定是否应该对受触发事件影响的每一行触发一次触发器过程,或者每个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;