1、数据准备
在PostGIS中导入点层数据valve,valve表中拥有字段(gid,oldno1,subtype,diameter,addr,geom),并建立valve的属性扩展表valve_ext
创建扩展表
--DROP SEQUENCE waterdataset.valve_ext_seq;
CREATE SEQUENCE waterdataset.valve_ext_seq
INCREMENT 1
START 1
MINVALUE 1
MAXVALUE 2147483647
CACHE 1;
ALTER SEQUENCE waterdataset.valve_ext_seq
OWNER TO postgres;
-- Table: waterdataset.valve_ext
--DROP TABLE waterdataset.valve_ext;
CREATE TABLE waterdataset.valve_ext
(
id integer NOT NULL DEFAULT nextval('waterdataset.valve_ext_seq'::regclass),
gid integer NOT NULL,
extname character(50) COLLATE pg_catalog."default",
CONSTRAINT valve_ext_pkey PRIMARY KEY (id)
USING INDEX TABLESPACE sy_water,
CONSTRAINT gid_unique UNIQUE (gid)
USING INDEX TABLESPACE sy_water
)
WITH (
OIDS = FALSE
)
TABLESPACE sy_water;
ALTER TABLE waterdataset.valve_ext
OWNER to postgres;
2、创建视图
基于点表valve和属性扩展表valve_ext建立视图valveview
--创建视图
CREATE OR REPLACE VIEW waterdataset.valveview AS
SELECT t1.gid,
t1.oldno1,
t1.subtype,
t1.diameter,
t1.addr,
t1.geom,
t2.extname
FROM waterdataset.valve t1
LEFT JOIN waterdataset.valve_ext t2 ON t1.gid = t2.gid;
ALTER TABLE waterdataset.valveview
OWNER TO postgres;
3、在QGIS中加载视图图层
在qgis中加载视图图层,启动图层编辑,编辑属性后提示不是简单视图,需要通过规则或触发器来制定更新、插入、删除命令。

4、建立视图的编辑规则
PostgreSQL规则语法
CREATE [ OR REPLACE ] RULE name AS ON event
TO table [ WHERE condition ]
DO [ ALSO | INSTEAD ] { NOTHING | command | ( command ; command ... ) }
基于以上语法我们创建视图的编辑规则,以update命令为例
因为我们的视图需要更新两个表,主表valve与扩展属性表valve_ext,所以在DO INSTAEAD后我们需要执行多条命令,按照语法在()中以分号分隔多条命令。
更新实现逻辑更新属性后先更新主表valve属性,然后更新valve_ext属性(如果不存在则插入,这里用到了PostgreSQL的upsert特性)
CREATE OR REPLACE RULE valveview_upd AS
ON UPDATE TO waterdataset.valveview
DO INSTEAD
( UPDATE waterdataset.valve
SET gid = new.gid, oldno1 = new.oldno1, subtype = new.subtype, diameter =
new.diameter, addr = new.addr, geom = new.geom
WHERE valve.gid = old.gid;
INSERT INTO waterdataset.valve_ext (gid, extname)
VALUES (new.gid, new.extname) ON CONFLICT(gid) DO UPDATE SET gid = excluded.gid, extname = excluded.extname;
);
PostgreSQL的upsert语法
INSERT INTO table VALUES(…) ON CONFLICT(唯一字段)DO UPDATE SET …
建立好规则后更新视图成功
UPDATE waterdataset.valveview SET gid=517,oldno1 = '1005',extname='扩展属性' WHERE gid = 517;UPDATE 1 耗时54 msec 成功返回查询