Làm cách nào để tránh các GID trùng lặp khi sao chép các tính năng từ một lớp PostGIS sang một lớp khác?


11

Khi tôi nhập các phần tử (tính năng) mới vào một lớp Postgres khác, tôi có thể thực hiện theo hai cách:

  1. Vẽ (các) phần tử mới (với 'Thêm tính năng') mà tôi hiếm khi hoặc
  2. Sao chép (hoặc cắt) một số phần tử từ một lớp Postgre khác (lớp Nguồn) và dán nó vào lớp mục tiêu mà tôi thường làm

Trong ví dụ đầu tiên, việc lưu các chỉnh sửa hoạt động bình thường vì lớp này bị gid từ chuỗi cơ sở dữ liệu postgre * nextval ('layer_name_gid_seq' :: reggroup) *

Trong ví dụ thứ hai, tôi đã gặp lỗi trong khi lưu các chỉnh sửa, bởi vì trong khi sao chép phần tử từ lớp nguồn sang lớp đích, qgis đã sao chép gid của phần tử từ lớp nguồn. Khi cố lưu các chỉnh sửa, lỗi này được trả về:

Không thể cam kết thay đổi đối với lớp „Cjevovodi
Lỗi Lỗi: ERROR: 1 tính năng chưa được thêm.
Lỗi nhà cung cấp:
Lỗi PostGIS trong khi thêm các tính năng: ERROR: giá trị khóa trùng lặp vi phạm ràng buộc duy nhất "cjevovodi_okill_pkey"
CHI TIẾT: Khóa (gid) = (5) đã tồn tại.

Tôi đã cố gắng sao chép * nextval ('layer_name_gid_seq' :: reggroup) * trong trường gid, nhưng chuỗi này không thể được dán trong trường gid vì trường được định nghĩa là số.

Có ai biết cách đơn giản để sao chép các phần tử từ lớp nguồn (với gid hiện có) gán gid mới không?

Cảm ơn!


Phiên bản nào của qgis và nền tảng bạn đang sử dụng? Tôi đang sử dụng QGIS 2.0 trong windows 7 và dường như tôi không gặp vấn đề gì trong việc sao chép giữa các lớp postigs.
Alexandre Neto

Bạn đã bao giờ tìm thấy một giải pháp cho vấn đề này? Tôi đang gặp vấn đề chính xác tương tự. Tôi không muốn phải kích hoạt vị trí trong PostgreSQL khi vấn đề của QGIS là không kéo các giá trị mặc định khi các tính năng mới được tạo bằng cách sao chép các phần tử khác.
Nhận không gian

Câu trả lời:


4

Tôi không thể sao chép điều này trong WindowsIS 2.2, c3a2817.

Nếu các phiên bản khác hoạt động khác đi hoặc nếu bạn tiếp tục gặp sự cố này, có lẽ bạn có thể thiết lập trình kích hoạt PostgreQuery trên bàn như một cách giải quyết:

Sử dụng bảng ví dụ này:

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

Đây là một chức năng kích hoạt sẽ chỉ định một gidnơi mới cần thiết:

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

Liên kết chức năng với bảng ...

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

Điều này sẽ tự động gán ID mới nơi gidđã tồn tại. Ví dụ: truy vấn sau đây sẽ sao chép tất cả dữ liệu trong bảng thay vì không thành công:

INSERT INTO testing (SELECT * FROM testing);

Tất nhiên, cách tiếp cận này có thể làm tổn hại ý định của khóa chính của bạn, vì vậy hãy sử dụng nó một cách cẩn thận.


0

Chọn các tính năng từ lớp nguồn và lưu được chọn (Lưu được chọn là ...) trong shapefile. Thêm shapefile đã lưu trong dự án QGIS và bảng thuộc tính mở, sau đó xóa trường "gid" và lưu shapefile. Chọn các tính năng trong shapefile và sao chép chúng trong lớp công việc của bạn.


Cảm ơn câu trả lời của bạn nhưng tôi đang cố gắng tìm một cách dễ dàng hơn để làm điều đó.
hapa

1
nếu bạn có bảng như gid serial, int i, bạn có thể chỉ cần chèn i và bạn nhận được gid tự động. Tôi có một số ký ức xa xôi rằng nó có thể có trong QGIS, nhưng tôi không thể nhớ lại cách thực hiện
Simplexio
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.