首页 > 解决方案 > 如何使用原始表中的序列 ID 创建可插入视图?

问题描述

我有一个巨大的点数据集,需要很长时间才能在不同的软件 (QGIS) 上为用户插入新内容。此表有一个序列类型的 id 列

为了解决这个问题,我创建了一个空视图,该视图具有与其原始表相同的字段。起初尝试限制 0,但它没有让它更新,所以我将视图大小设置为很小,而 where 条件永远不会满足,所以我最终得到了一个空表

现在的问题是,在插入新特性时,他们没有得到原表的 id,而在原表上的新插入需要 id,因为它是主键,它还会激活其他触发器。有时用户需要将多个新插入复制并粘贴到此表中

如何使其使用与原始表相同的序列并允许人们在其上插入新特征?我很欣赏这种观点可能不是最好的解决方案,但愿意接受任何更好的选择

CREATE OR REPLACE VIEW myview
AS SELECT id,
postcode,
address,
status
FROM mytable WHERE status = 123


CREATE TABLE public.pt (
id serial NOT NULL,
postcode varchar NULL,
address text NULL,
status int2 NOT NULL

CREATE SEQUENCE mytable_seq
INCREMENT BY 1
MINVALUE 36339
MAXVALUE 9223372036854775807
START 691524
CACHE 1
NO CYCLE;

obv 修剪了许多列。我不确定插入语句是什么

标签: sqlpostgresqlsql-view

解决方案


一个建议:

您可以在另一个表中创建这个大表的子集,而不是使用视图:

CREATE TABLE mytable_subset AS SELECT id,postcode,address,status
FROM mytable WHERE status = 123;

那么管理它的最简单方法是使用触发器。首先创建一个函数来处理 id:

CREATE OR REPLACE FUNCTION update_view_id() RETURNS trigger AS
$BODY$
BEGIN
  SELECT nextval('mytable_seq') INTO NEW.id;
  RETURN NEW;
END;
$BODY$ LANGUAGE 'plpgsql';

然后将其附加到触发器:

CREATE TRIGGER check_update_view BEFORE INSERT ON mytable_subset
FOR EACH ROW EXECUTE PROCEDURE update_view_id();

因此,每次插入新记录时,id 值都会被nextval序列的 id 值替换。

INSERT INTO mytable_subset(id,postcode,address,status) VALUES (42,'0000','st. one',1);
INSERT INTO mytable_subset (postcode,address,status) VALUES ('0000','st. one',1);

SELECT * FROM mytable_subset;
 id | postcode | address | status 
----+----------+---------+--------
  1 | 0000     | st. one |      1
  2 | 0000     | st. two |      1
(2 Zeilen)

推荐阅读