Özellikleri bir PostGIS katmanından diğerine kopyalarken yinelenen GID'leri nasıl önleyebilirim?


11

Başka bir Postgres katmanına yeni öğeler (özellikler) girdiğimde, bunu iki şekilde yapabilirim:

  1. Nadiren yaptığım yeni elemanlar ('Özellik ekle' ile) veya
  2. Bazı öğeleri başka bir Postgre katmanından (Kaynak katman) kopyalama (veya kesme) ve sık sık yaptığım hedef katmana yapıştırma

İlk örnekte, düzenlemelerin tasarrufu bu katman olur çünkü Normal çalışır gid postgre veritabanı dizisinden * nextval ( 'layer_name_gid_seq' :: regclass) *

Hedef tabakasına kaynak katmanından elemanı kopyalanırken kopyalanan QGIS çünkü İkinci örnekte, ben, tasarruf düzenlemeler sırasında bir hata var gid kaynak katmanından elemanın. Düzenlemeleri kaydetmeye çalışırken bu hata döndürülür:

"Cjevovodi" katmanında değişiklikler yapılamadı
Hatalar: HATA: 1 özellik eklenmedi.
Sağlayıcı hataları:
Özellik eklenirken PostGIS hatası: HATA: yinelenen anahtar değeri benzersiz kısıtlamayı ihlal ediyor "cjevovodi_okill_pkey"
DETAY: Anahtar (gid) = (5) zaten var.

Alan next'te * nextval ('layer_name_gid_seq' :: regclass) * kopyalamaya çalıştım, ancak alan sayısal olarak tanımlandığı için bu sıra alan gid'e yapıştırılamaz.

Kaynak katmandan (mevcut gid ile) öğeleri kopyalamanın basit bir yolunu bilen var mı?

Teşekkürler!


Hangi qgis ve platform sürümünü kullanıyorsunuz? Windows 7'de QGIS 2.0 kullanıyorum ve postigs katmanları arasında kopya yapıştırmada sorun yaşamıyorum.
Alexandre Neto

Hiç bu soruna bir çözüm buldunuz mu? Ben de aynı sorunla karşılaşıyorum. Başkaları kopyalayarak yeni özellikler oluşturulduğunda QGIS'in varsayılan değerleri çekmemesi söz konusu olduğunda PostgreSQL'de bir tetikleyici koymak istemiyorum.
Spatial

Yanıtlar:


4

Bunu QGIS 2.2 Windows, c3a2817 ile çoğaltamıyorum.

Diğer sürümler farklı davranıyorsa veya bu sorunu yaşamaya devam ediyorsanız, büyük olasılıkla geçici çözüm olarak bir PostgreSQL tetikleyicisi ayarlayabilirsiniz:

Bu örnek tabloyu kullanarak:

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

İşte gidgerektiğinde yeni bir atama yapacak bir tetikleyici işlevi :

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';

İşlevi tabloya bağlama ...

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

Bu, otomatik olarak gidzaten mevcut olan yerlerde yeni kimlikler atar . Örneğin, aşağıdaki sorgu artık başarısız olmak yerine tablodaki tüm verileri çoğaltacaktır:

INSERT INTO testing (SELECT * FROM testing);

Tabii ki, bu yaklaşım birincil anahtarınızın amacını tehlikeye atabilir, bu yüzden dikkatli kullanın.


0

Kaynak katmandaki özellikleri seçin ve seçili (Seçili olarak kaydet ...) şekil dosyasına kaydedin. QGIS projesine kaydedilmiş şekil dosyasını ekleyin ve öznitelik tablosunu açın, ardından "gid" alanını silin ve şekil dosyasını kaydedin. Şekil dosyasındaki özellikleri seçin ve bunları çalışma katmanınıza kopyalayın.


Cevabınız için teşekkürler ama bunu yapmanın daha kolay bir yolunu bulmaya çalışıyorum.
Hapa

1
gid seri, int i gibi bir tablonuz varsa, sadece i ekleyebilir ve otomatik olarak gid alabilirsiniz. muhtemelen QGIS içinde olduğu bazı uzak bellek var, ama bunu nasıl hatırlayamıyorum
simplexio
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.