如何使用其来源 table 的序列 ID 创建插入 table 视图?
How to create insertable view with a sequence id from its origin table?
我有一个巨大的点数据集,需要很长时间才能为不同软件 (QGIS) 上的用户插入新内容。这个 table 有一个类型为 serial
的 id 列
为了解决这个问题,我创建了一个空视图,它具有与原始视图完全相同的字段 table。起初尝试 limit 0 但它没有让它更新所以我使视图大小变小,where 条件永远不会满足,所以我最终得到一个空的 table
现在的问题是,在插入新特征时,它们无法获得原始 table 的 ID,而原始 table 上的新插入需要 ID,因为它是主键,并且它还会激活其他触发器。有时用户需要将多个新插入内容复制并粘贴到此 table
如何让它使用与原始序列相同的序列 table 并允许人们在其上插入新特征?我很欣赏这种观点可能不是最好的解决方案,但可以接受任何更好的选择
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 削减了许多列。我不确定插入语句是什么
一个建议:
您可以在另一个 table:
中创建这个大 table 的子集,而不是使用视图
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
替换。
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)
我有一个巨大的点数据集,需要很长时间才能为不同软件 (QGIS) 上的用户插入新内容。这个 table 有一个类型为 serial
的 id 列为了解决这个问题,我创建了一个空视图,它具有与原始视图完全相同的字段 table。起初尝试 limit 0 但它没有让它更新所以我使视图大小变小,where 条件永远不会满足,所以我最终得到一个空的 table
现在的问题是,在插入新特征时,它们无法获得原始 table 的 ID,而原始 table 上的新插入需要 ID,因为它是主键,并且它还会激活其他触发器。有时用户需要将多个新插入内容复制并粘贴到此 table
如何让它使用与原始序列相同的序列 table 并允许人们在其上插入新特征?我很欣赏这种观点可能不是最好的解决方案,但可以接受任何更好的选择
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 削减了许多列。我不确定插入语句是什么
一个建议:
您可以在另一个 table:
中创建这个大 table 的子集,而不是使用视图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
替换。
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)