Postgresql同一日期记录插入

时间:2018-04-09 11:18:06

标签: postgresql database-trigger postgresql-9.5

我使用的是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

当我更新功能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;

1 个答案:

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