将从多行构建一行的触发器
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 中引入。
我的意思是:
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 中,您可以