Sql 如何从原始表创建具有序列id的可插入视图?
我有一个巨大的点数据集,需要很长时间才能在不同的软件(QGIS)上为用户插入新内容。此表有一个串行类型的id列 为了解决这个问题,我创建了一个空视图,该视图具有与其原始表相同的字段。起初尝试限制0,但它不允许它更新,因此我使用了一个从未满足的where条件使视图大小变小,因此我最终得到了一个空表 现在的问题是,当插入新特性时,它们不会获得原始表的id,而原始表上的新插入需要该id,因为它是主键,并且还会激活其他触发器。有时,用户需要将多个新插入复制并粘贴到此表上 如何使其使用与原始表相同的顺序,并使人们能够在其上插入新功能?我理解这种观点可能不是最好的解决办法,但会有更好的选择Sql 如何从原始表创建具有序列id的可插入视图?,sql,postgresql,sql-view,Sql,Postgresql,Sql View,我有一个巨大的点数据集,需要很长时间才能在不同的软件(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削减了许多列。我不确定insert语句是什么
不使用视图,您可以在另一个表中创建此大表的子集:
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)
请添加
create table
、create sequence
和insert
语句,以便我们更好地重现您的环境。您需要QGIS中的ID吗?如果没有,只需将其从视图中删除,而不是从触发器中删除。或者将其保留在视图中,但将其从触发器中删除(即用户提交的id
字段的值将不会被使用)@jgh噢,该死,它工作了!!谢谢,伙计,这不是一个简单的插入语句,这就是为什么我没有把它包括在这里。QGIS使用光标,不幸的是,这些用户不是程序员,所以他们需要使用这个简单的界面。虽然QGIS使用SQL,但它没有nextval函数。这里会有一个替代触发器工作吗?哦,现在我明白了,对不起:)在这种情况下,触发器是最简单的方法。我会更新我的answer@Luffydude是否可以选择创建另一个表而不是视图?而不是创建视图w作为select*from t
类似创建表w作为select*from t
。这将使触发器的使用更加容易。不管怎样,他们会有不同的价值观。事实上,JGH的解决方案是有效的,它非常简单,但你的答案似乎也有效,所以也给了你一些互联网点数:)