एक पोस्टगिस लेयर से दूसरे में फीचर्स कॉपी करते समय डुप्लीकेट जीआईडी ​​से कैसे बचें?


11

जब मैं एक और पोस्टग्रेज परत में नए तत्वों (सुविधाओं) को दर्ज करता हूं, तो मैं इसे दो तरीकों से कर सकता हूं:

  1. नया तत्व (एस) जोड़ें ('सुविधा जोड़ें') जो मैं शायद ही कभी करता हूं या
  2. किसी अन्य पोस्टग्रे लेयर (स्रोत परत) से कुछ तत्वों की प्रतिलिपि बनाना (या काटना), और इसे लक्ष्य परत में पेस्ट करें जो मैं अक्सर करता हूं

पहले उदाहरण में, संपादन के बचत सामान्य काम करता है क्योंकि इस परत हो जाता है gid postgre डेटाबेस अनुक्रम से * nextval ( 'layer_name_gid_seq' :: regclass) *

दूसरे उदाहरण में, मुझे संपादन सहेजने के दौरान एक त्रुटि मिली, क्योंकि स्रोत परत से तत्व को कॉपी करते समय लक्ष्य परत के लिए qgis ने स्रोत परत से तत्व के gid की प्रतिलिपि बनाई । संपादन को सहेजने का प्रयास करते समय यह त्रुटि वापस आ जाती है:

परत में परिवर्तन नहीं कर सका ev Cjevovodi "
त्रुटियां: त्रुटि: 1 सुविधा (एस) को नहीं जोड़ा गया।
प्रदाता की त्रुटियां:
सुविधाएँ जोड़ते समय PostGIS त्रुटि: ERROR: डुप्लिकेट कुंजी मान अद्वितीय बाधा का उल्लंघन करता है "cjevovodi_okill_pkey"
विवरण: कुंजी (gid) = (5) पहले से मौजूद है।

मैंने फ़ील्ड gid में * nextval ('layer_name_gid_seq' :: regclass) * को कॉपी करने की कोशिश की, लेकिन इस क्रम को फ़ील्ड gid में चिपकाया नहीं जा सकता क्योंकि फ़ील्ड को संख्यात्मक के रूप में परिभाषित किया गया है।

क्या किसी को स्रोत परत से तत्वों को कॉपी करने का सरल तरीका पता है (मौजूदा gid के साथ) नया gid असाइन करें?

धन्यवाद!


किस संस्करण और क्यूजीस का आप उपयोग कर रहे हैं? मैं विंडोज़ 7 में क्यूजीआईएस 2.0 का उपयोग कर रहा हूं और मुझे पोस्टिग लेयर्स के बीच कॉपी पेस्ट में कोई समस्या नहीं है।
अलेक्जेंड्रे नेटो

क्या आपको कभी इस समस्या का हल मिला? मैं ठीक उसी मुद्दे का सामना कर रहा हूं। मैं नहीं चाहता कि जब PostGreSQL में एक ट्रिगर लगाया जाए तो यह क्यूजीआईएस द्वारा डिफ़ॉल्ट मूल्यों को नहीं खींचने की बात है जब नई विशेषताओं को दूसरों को कॉपी करके बनाया जाता है।
स्थानिक

जवाबों:


4

मैं QGIS 2.2 विंडोज, c3a2817 में इसे पुन: पेश करने में सक्षम नहीं हूं।

यदि अन्य संस्करण अलग-अलग व्यवहार करते हैं, या यदि आप इस समस्या को जारी रख रहे हैं, तो आप संभवतः वर्कअराउंड के रूप में टेबल पर एक पोस्टग्रेएसक्यू ट्रिगर स्थापित कर सकते हैं:

इस उदाहरण तालिका का उपयोग करना:

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();

यह स्वचालित रूप से नई आईडी असाइन करेगा जहां gidपहले से मौजूद है। उदाहरण के लिए, निम्न क्वेरी अब विफल होने के बजाय तालिका के सभी डेटा की नकल करेगी:

INSERT INTO testing (SELECT * FROM testing);

बेशक, यह दृष्टिकोण आपकी प्राथमिक कुंजी के इरादे से समझौता कर सकता है, इसलिए इसे सावधानी से उपयोग करें।


0

स्रोत परत से सुविधाओं का चयन करें और आकार में चयनित (इस रूप में चयनित सहेजें ...) को सहेजें। QGIS प्रोजेक्ट में सहेजी गई शेपफाइल जोड़ें और विशेषता तालिका खोलें, फिर फ़ील्ड "gid" हटाएं और शेपफाइल को सहेजें। आकृति में सुविधाओं का चयन करें और उन्हें अपने काम की परत में कॉपी करें।


आपके उत्तर के लिए धन्यवाद, लेकिन मैं इसे करने का एक आसान तरीका खोजने की कोशिश कर रहा हूं।
हापा

1
अगर आपके पास gid सीरियल जैसी तालिका है, तो int, आप सिर्फ i डाल सकते हैं और आप स्वचालित रूप से gid प्राप्त कर सकते हैं। मुझे कुछ दूर की याद है कि यह संभवतः QGIS में है, लेकिन मुझे याद नहीं है कि यह कैसे करना है
simplexio
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.