Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何从原始表创建具有序列id的可插入视图?_Sql_Postgresql_Sql View - Fatal编程技术网

Sql 如何从原始表创建具有序列id的可插入视图?

Sql 如何从原始表创建具有序列id的可插入视图?,sql,postgresql,sql-view,Sql,Postgresql,Sql View,我有一个巨大的点数据集,需要很长时间才能在不同的软件(QGIS)上为用户插入新内容。此表有一个串行类型的id列 为了解决这个问题,我创建了一个空视图,该视图具有与其原始表相同的字段。起初尝试限制0,但它不允许它更新,因此我使用了一个从未满足的where条件使视图大小变小,因此我最终得到了一个空表 现在的问题是,当插入新特性时,它们不会获得原始表的id,而原始表上的新插入需要该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削减了许多列。我不确定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的解决方案是有效的,它非常简单,但你的答案似乎也有效,所以也给了你一些互联网点数:)