วิธีหลีกเลี่ยง GID ที่ซ้ำกันเมื่อทำการคัดลอกฟีเจอร์จากเลเยอร์ PostGIS หนึ่งไปอีกอันหนึ่ง


11

เมื่อฉันเข้าองค์ประกอบใหม่ (คุณสมบัติ) ในเลเยอร์ Postgres อีกฉันสามารถทำได้สองวิธี:

  1. การวาดองค์ประกอบใหม่ (ด้วย 'เพิ่มคุณสมบัติ') ซึ่งฉันไม่ค่อยทำหรือ
  2. การคัดลอก (หรือการตัด) องค์ประกอบบางอย่างจากเลเยอร์ Postgre อื่น (เลเยอร์แหล่งที่มา) และวางลงในเลเยอร์เป้าหมายซึ่งฉันทำบ่อยๆ

ในตัวอย่างแรกการบันทึกการแก้ไขทำงานตามปกติเนื่องจากเลเยอร์นี้ได้รับgidจากลำดับฐานข้อมูล postgre * nextval ('layer_name_gid_seq' :: regclass) *

ในตัวอย่างที่สองฉันได้รับข้อผิดพลาดระหว่างการบันทึกการแก้ไขเพราะในขณะที่การคัดลอกองค์ประกอบจากเลเยอร์ต้นทางไปยังเลเยอร์เป้าหมาย qgis คัดลอก gidขององค์ประกอบจากเลเยอร์ต้นทาง เมื่อพยายามบันทึกการแก้ไขข้อผิดพลาดนี้จะถูกส่งคืน:

ไม่สามารถคอมมิชชันการเปลี่ยนแปลงในเลเยอร์„ Cjevovodi“
ข้อผิดพลาด: ข้อผิดพลาด: 1 ไม่ได้เพิ่มคุณสมบัติ
ข้อผิดพลาดของผู้ให้บริการ: ข้อผิดพลาดของ
PostGIS ขณะที่เพิ่มคุณสมบัติ: ข้อผิดพลาด: ค่าคีย์ที่ซ้ำกันละเมิดข้อ จำกัด ที่ไม่ซ้ำกัน "cjevovodi_okill_pkey" ราย
ละเอียด: Key (gid) = (5) มีอยู่แล้ว

ฉันพยายามคัดลอก * nextval ('layer_name_gid_seq' :: regclass) * ในฟิลด์ gid แต่ลำดับนี้ไม่สามารถวางในฟิลด์ gid ได้เนื่องจากฟิลด์ถูกกำหนดเป็นตัวเลข

ไม่มีใครรู้วิธีการง่ายๆในการคัดลอกองค์ประกอบจากเลเยอร์แหล่งที่มา (ด้วย gid ที่มีอยู่) กำหนด gid ใหม่หรือไม่

ขอบคุณ!


คุณใช้ qgis และแพลตฟอร์มเวอร์ชันใดอยู่ ฉันใช้ QGIS 2.0 ใน windows 7 และดูเหมือนว่าฉันไม่มีปัญหาในการคัดลอกวางระหว่างเลเยอร์ Postigs
Alexandre Neto

คุณเคยพบวิธีแก้ปัญหานี้หรือไม่? ฉันกำลังประสบปัญหาเดียวกันที่แน่นอน ฉันไม่ต้องการที่จะวางทริกเกอร์ใน PostgreSQL เมื่อมันเป็นเรื่องของ QGIS ไม่ดึงค่าเริ่มต้นเมื่อคุณสมบัติใหม่ถูกสร้างขึ้นโดยการคัดลอกอื่น ๆ
Spatial

คำตอบ:


4

ฉันไม่สามารถทำซ้ำได้ใน QGIS 2.2 Windows, c3a2817

หากเวอร์ชันอื่นทำงานแตกต่างกันหรือหากคุณยังคงประสบปัญหานี้อยู่คุณสามารถตั้งค่าทริกเกอร์ PostgreSQL บนโต๊ะเพื่อแก้ไขปัญหา:

ใช้ตารางตัวอย่างนี้:

CREATE TABLE testing (gid serial PRIMARY KEY, geom geometry(Polygon, 4326));

นี่คือฟังก์ชันทริกเกอร์ที่จะกำหนดใหม่gidเมื่อจำเป็น:

CREATE OR REPLACE FUNCTION testing_insert_trigger()
RETURNS trigger AS
$$
BEGIN
IF EXISTS (SELECT 1 FROM testing WHERE gid = NEW.gid) THEN
    NEW.gid := nextval('testing_gid_seq'::regclass);
END IF;
RETURN NEW;
END;
$$ language 'plpgsql';

การผูกฟังก์ชันกับตาราง ...

CREATE TRIGGER testing_insert 
BEFORE INSERT ON testing
FOR EACH ROW EXECUTE PROCEDURE testing_insert_trigger();

นี่จะกำหนด ID ใหม่โดยอัตโนมัติเมื่อgidมีอยู่แล้ว ตัวอย่างเช่นแบบสอบถามต่อไปนี้จะทำซ้ำข้อมูลทั้งหมดในตารางแทนที่จะล้มเหลว:

INSERT INTO testing (SELECT * FROM testing);

แน่นอนวิธีการนี้สามารถลดความตั้งใจของคีย์หลักของคุณดังนั้นใช้อย่างระมัดระวัง


0

เลือกคุณสมบัติจากเลเยอร์ต้นทางและบันทึกที่เลือก (บันทึกรายการที่เลือกเป็น ... ) ใน shapefile เพิ่ม Shapefile ที่บันทึกไว้ในโครงการ QGIS และตารางแอตทริบิวต์เปิดจากนั้นลบฟิลด์ "gid" และบันทึก shapefile เลือกคุณสมบัติใน shapefile และคัดลอกไว้ในเลเยอร์งานของคุณ


ขอบคุณสำหรับคำตอบของคุณ แต่ฉันพยายามหาวิธีที่ง่ายกว่านี้
hapa

1
หากคุณมีตารางเช่น gid serial, int i, คุณสามารถแทรก i และคุณจะได้ gid โดยอัตโนมัติ ฉันมีหน่วยความจำที่ห่างไกลว่าเป็นไปได้ใน QGIS แต่ฉันจำไม่ได้ว่าจะทำอย่างไร
simplexio
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.