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; );
--EXCLUDED upsert語法中待插入的數據對象關鍵字
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 成功返回查詢