将从多行构建一行的触发器

Trigger that will build one row from several rows

我的意思是:

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

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

1, E'message\nmessage\nmessage'

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

在 Postgres 10+ 中,您可以在 AFTER 触发器中使用转换 table,请参阅 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 $$;

在触发器定义中声明一个转换 table(如 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 中,您可以 在 Postgres 10 中引入。

Test it in db<>fiddle.