한 PostGIS 레이어에서 다른 PostGIS 레이어로 피처를 복사 할 때 중복 GID를 피하는 방법은 무엇입니까?


11

다른 Postgres 레이어에 새 요소 (기능)를 입력하면 두 가지 방법으로 수행 할 수 있습니다.

  1. 거의 또는 전혀하지 않는 새로운 요소 그리기 ( '기능 추가'사용)
  2. 다른 Postgre 레이어 (소스 레이어)에서 일부 요소를 복사 (또는 잘라 내기)하고 자주하는 대상 레이어에 붙여 넣기

첫 번째 예에서이 레이어는 postgre 데이터베이스 시퀀스 * nextval ( 'layer_name_gid_seq':: regclass) *에서 gid 를 가져 오기 때문에 편집 저장이 정상적으로 작동합니다.

두 번째 예에서는 소스 레이어에서 대상 레이어로 요소를 복사하는 동안 qgis 가 소스 레이어에서 요소의 gid 를 복사했기 때문에 편집을 저장하는 동안 오류가 발생했습니다 . 편집 내용을 저장하려고하면이 오류가 반환됩니다.

"Cjevovodi"레이어에 대한 변경 사항을 커밋 할 수 없습니다.
오류 : 오류 : 1 기능이 추가되지 않았습니다.
제공자 오류 :
기능 추가 중 PostGIS 오류 : 오류 : 중복 키 값이 고유 제한 조건 "cjevovodi_okill_pkey"을 위반합니다
. 세부 사항 : 키 (gid) = (5)가 이미 존재합니다.

필드 gid에 * nextval ( 'layer_name_gid_seq':: regclass) *를 복사하려고했지만 필드가 숫자로 정의되어 있으므로이 시퀀스를 필드 gid에 붙여 넣을 수 없습니다.

누구나 기존 gid와 함께 소스 레이어에서 요소를 복사하는 간단한 방법을 알고 새로운 gid를 할당합니까?

감사!


어떤 버전의 qgi 및 플랫폼을 사용하고 있습니까? Windows 7에서 QGIS 2.0을 사용하고 있는데 postigs 레이어 사이의 복사 붙여 넣기에 문제가없는 것 같습니다.
Alexandre Neto

이 문제에 대한 해결책을 찾은 적이 있습니까? 똑같은 문제가 발생했습니다. QgreS가 다른 기능을 복사하여 새 기능을 만들 때 기본값을 가져 오지 않는 문제로 PostgreSQL에 트리거를 배치하고 싶지 않습니다.
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();

gid이미 존재하는 곳에 새로운 ID를 자동으로 할당 합니다. 예를 들어 다음 쿼리는 이제 실패하지 않고 테이블의 모든 데이터를 복제합니다.

INSERT INTO testing (SELECT * FROM testing);

물론이 방법은 기본 키의 의도를 손상시킬 수 있으므로주의해서 사용하십시오.


0

소스 레이어에서 피처를 선택하고 선택한 (다른 이름으로 선택한 이름으로 저장 ...)을 셰이프 파일에 저장합니다. QGIS 프로젝트에 저장된 shapefile을 추가하고 속성 테이블을 연 다음 "gid"필드를 삭제하고 shapefile을 저장하십시오. shapefile에서 피처를 선택하고 작업 레이어에서 복사하십시오.


귀하의 답변에 감사드립니다.하지만 더 쉬운 방법을 찾으려고 노력하고 있습니다.
hapa

1
gid serial, int i와 같은 테이블이있는 경우 i를 삽입하면 자동으로 gid를 얻을 수 있습니다. QGIS에있는 먼 메모리가 있지만 어떻게
해야하는지
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.