更新觸發器中同一個表的其他行是非常棘手的,因爲它會導致遞歸觸發器調用。一般來說,你應該避免這樣的解決方案。重新考慮你的數據模型並考慮是否真的需要actual
字段。您可以隨時在這樣的查詢選擇實際行(我假設my_table
有場id
作爲主鍵):
select distinct on(category) id, category, edit_date
from my_table
order by 2, 3 desc;
然而,如果該字段actual
是必要的,你可以創建一個功能需要使用它在my_table
或乾脆任何變化之後,當:
create or replace function set_my_table_actual()
returns void language sql
as $$
update my_table t
set
actual = (
t.id = any (
select x.id
from (
select distinct on(category) id, category, edit_date
from my_table
order by 2, 3 desc
) x
)
);
$$;
好吧,如果你絕對要一個觸發器,可以使用pg_trigger_depth()
功能(這是在Postgres的9.2中引入):
create or replace function my_trigger()
returns trigger language plpgsql
as $$
begin
if pg_trigger_depth() = 1 then
perform set_my_table_actual();
end if;
return null;
end $$;
create trigger my_trigger
after insert or update or delete
on my_table for each statement
execute procedure my_trigger();