Postgresql同日记录插入

Postgresql same date record insert

我正在使用 Postgresql 9.5 数据库。第三方软件应用程序也在使用该数据库。我有一个 Features table。我创建了一个 Events table 来记录 Features 事件。

Features
------------
id     name   lon   lat
1        x     0    10
2        y     15   20

当我在 Features table 中创建一条记录时,我的触发器将一条记录插入 Events table。

Events
id    name      date                    feature_id
1     insert    09.04.2018 14:22:23.065125        1

当我更新功能namelonlat并保存时,软件执行同时产生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;

最好的解决方案是选择退出执行多个更新而不是实际执行单个更新的软件。但是,如果你不能这样做,你可以为 events table 添加一个触发器,例如:

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();