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
当我更新功能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;
最好的解决方案是选择退出执行多个更新而不是实际执行单个更新的软件。但是,如果你不能这样做,你可以为 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();
我正在使用 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
当我更新功能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;
最好的解决方案是选择退出执行多个更新而不是实际执行单个更新的软件。但是,如果你不能这样做,你可以为 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();