触发将从多行建立一行

时间:2018-11-19 11:06:18

标签: postgresql plpgsql database-trigger

我的意思是:

INSERT INTO test VALUES(1, 'message'), (2, 'message'), (3, 'message);

触发将导致表中的结果如下所示:

1, E'message\nmessage\nmessage'

如何禁止插入行,然后继续对插入的传输数据进行操作? 我正在使用postresgql。

1 个答案:

答案 0 :(得分:1)

在Postgres 10+中,您可以在AFTER触发器中使用转换表,请参见Example 43.7. Auditing with Transition Tables。假设id是主键(或唯一键):

create table my_table(id int primary key, message text);

您可以更新一个并删除其余插入的行:

create or replace function after_insert_on_my_table()
returns trigger language plpgsql as $$
declare r record;
begin
    select 
        array_agg(id) as ids, 
        array_to_string(array_agg(message), e'\n') as message
    from new_table
    into r;

    update my_table
    set message = r.message
    where id = r.ids[1];

    delete from my_table
    where id = any(r.ids[2:]);

    return null;
end $$;

在触发器定义中声明一个过渡表(如new_table):

create trigger after_insert_on_my_table
after insert on my_table
referencing new table as new_table
for each statement 
execute procedure after_insert_on_my_table();

在早期版本的Postgres中,您可以simulate a transition table在Postgres 10中引入。

Test it in db<>fiddle.

相关问题