Bagaimana cara menghindari duplikat GID saat menyalin fitur dari satu lapisan PostGIS ke yang lain?

11

Ketika saya memasukkan elemen (fitur) baru di lapisan Postgres lain, saya bisa melakukannya dengan dua cara:

  1. Menggambar elemen baru (dengan 'Tambahkan fitur') yang jarang saya lakukan atau
  2. Menyalin (atau memotong) beberapa elemen dari layer Postgre lain (Source layer), dan menempelkannya ke layer target yang sering saya lakukan

Pada contoh pertama, penghematan hasil edit berjalan normal karena layer ini mendapatkan gid dari urutan basis data postgre * nextval ('layer_name_gid_seq' :: regclass) *

Dalam contoh kedua, saya mendapat kesalahan saat menyimpan suntingan, karena saat menyalin elemen dari lapisan sumber ke lapisan target qgis menyalin gid elemen dari lapisan sumber. Saat mencoba menyimpan hasil edit, kesalahan ini dikembalikan:

Tidak dapat melakukan perubahan pada layer „Cjevovodi“
Kesalahan: ERROR: 1 fitur tidak ditambahkan.
Kesalahan penyedia:
Kesalahan PostGIS saat menambahkan fitur: ERROR: nilai kunci duplikat melanggar batasan unik "cjevovodi_okill_pkey"
DETAIL: Kunci (gid) = (5) sudah ada.

Saya mencoba untuk menyalin * nextval ('layer_name_gid_seq' :: regclass) * di bidang gid, tetapi urutan ini tidak dapat disisipkan di bidang gid karena bidang didefinisikan sebagai numerik.

Adakah yang tahu cara sederhana untuk menyalin elemen dari layer sumber (dengan gid yang ada) menetapkan gid baru?

Terima kasih!

hapa
sumber
Versi qgis dan platform apa yang Anda gunakan? Saya menggunakan QGIS 2.0 di windows 7 dan saya sepertinya tidak memiliki masalah dalam copy paste antara lapisan postigs.
Alexandre Neto
Apakah Anda pernah menemukan solusi untuk masalah ini? Saya menghadapi masalah yang sama persis. Saya tidak ingin harus meletakkan pemicu di PostgreSQL ketika itu adalah masalah QGIS tidak menarik nilai default ketika fitur baru dibuat dengan menyalin yang lain.
Dapatkan Spasial

Jawaban:

4

Saya tidak dapat mereproduksi ini di QGIS 2.2 Windows, c3a2817.

Jika versi lain berperilaku berbeda, atau jika Anda terus memiliki masalah ini, Anda mungkin dapat mengatur pemicu PostgreSQL di atas meja sebagai solusi:

Menggunakan tabel contoh ini:

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

Berikut adalah fungsi pemicu yang akan menetapkan yang baru di gidmana diperlukan:

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

Mengikat fungsi ke meja ...

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

Ini secara otomatis akan menetapkan ID baru di mana yang gidsudah ada. Misalnya, kueri berikut sekarang akan menduplikasi semua data dalam tabel alih-alih gagal:

INSERT INTO testing (SELECT * FROM testing);

Tentu saja, pendekatan ini dapat membahayakan maksud kunci utama Anda, jadi gunakan dengan hati-hati.

dbaston
sumber
0

Pilih fitur dari lapisan sumber dan simpan yang dipilih (Simpan dipilih sebagai ...) di shapefile. Tambahkan shapefile yang disimpan dalam proyek QGIS dan buka tabel atribut, lalu hapus bidang "gid" dan simpan shapefile. Pilih fitur di shapefile dan salin di lapisan kerja Anda.

spatialhast
sumber
Terima kasih atas jawaban Anda, tetapi saya mencoba mencari cara yang lebih mudah untuk melakukannya.
hapa
1
jika Anda memiliki tabel seperti gid serial, int i, Anda bisa memasukkan saya dan Anda mendapatkan gid secara otomatis. saya memiliki beberapa memori jauh yang mungkin ada di QGIS, tetapi saya tidak ingat bagaimana melakukannya
simplexio