我使用的是Postgresql 9.5数据库。第三方软件应用程序也在使用此数据库。我有一个Features
表。我创建了一个Events
表来记录Features
个事件。
Features
------------
id name lon lat
1 x 0 10
2 y 15 20
当我在Features
表中创建记录时,我的触发器会在Events
表中插入记录。
Events
id name date feature_id
1 insert 09.04.2018 14:22:23.065125 1
当我更新功能name
,lon
和lat
并保存时,软件执行会同时产生3条更新记录。
Events
id name date feature_id
1 insert 09.04.2018 14:22:23.065125 1
2 update 09.04.2018 18:15:41.099689 1
3 update 09.04.2018 18:15:41.099689 1
4 update 09.04.2018 18:15:41.099689 1
但这是3更新是相同的值。
如何在触发器中对此进行限制?
我的触发功能:
CREATE FUNCTION event_fn() AS $BODY$ BEGIN
IF TG_OP = 'INSERT' THEN
INSERT INTO events (event_name, event_date, feature_id) VALUES ('insert', now(), NEW.id);
RETURN NEW;
END IF;
IF TG_OP = 'UPDATE' THEN
INSERT INTO events (event_name, event_date, feature_id) VALUES ('update', now(), NEW.id);
RETURN NEW;
END IF;
IF TG_OP = 'DELETE' THEN
INSERT INTO events (event_name, event_date, feature_id) VALUES ('delete', now(), OLD.id);
RETURN OLD;
END IF;
END;
答案 0 :(得分:0)
最好的解决方案是选择退出执行多个更新的软件,而不是实际的单个更新。但是,如果您无法执行此操作,则可以为events
表添加触发器,例如:
create or replace function before_insert_on_events()
returns trigger language plpgsql as $$
begin
if exists (
select 1
from events e
where e.name = new.name
and e.date = new.date
and e.feature_id = new.feature_id)
then new = null;
end if;
return new;
end $$;
create trigger before_insert_on_events
before insert on events
for each row
execute procedure before_insert_on_events();