我的意思是:
INSERT INTO test VALUES(1, 'message'), (2, 'message'), (3, 'message);
触发将导致表中的结果如下所示:
1, E'message\nmessage\nmessage'
如何禁止插入行,然后继续对插入的传输数据进行操作? 我正在使用postresgql。
答案 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中引入。