Jak uniknąć powielania identyfikatorów GID podczas kopiowania funkcji z jednej warstwy PostGIS na drugą?

11

Kiedy wprowadzam nowe elementy (funkcje) w innej warstwie Postgres, mogę to zrobić na dwa sposoby:

  1. Rysowanie nowych elementów (za pomocą funkcji „Dodaj funkcję”), które robię rzadko lub
  2. Kopiowanie (lub wycinanie) niektórych elementów z innej warstwy Postgre (warstwa źródłowa) i wklejanie do warstwy docelowej, co często robię

W pierwszym przykładzie zapisywanie zmian działa normalnie, ponieważ warstwa ta dostaje gid z sekwencji bazy danych postgre * nextval ('nazwa_warstwy_gid_seq' :: regclass) *

W drugim przykładzie wystąpił błąd podczas zapisywania edycji, ponieważ podczas kopiowania elementu z warstwy źródłowej na warstwę docelową qgis skopiował gid elementu z warstwy źródłowej. Podczas próby zapisania zmian zwracany jest ten błąd:

Nie można zatwierdzić zmian w warstwie „Cjevovodi”
Błędy: BŁĄD: nie dodano 1 funkcji.
Błędy dostawcy:
błąd PostGIS podczas dodawania funkcji: BŁĄD: zduplikowana wartość klucza narusza unikalne ograniczenie „cjevovodi_okill_pkey”
SZCZEGÓŁY: Klucz (gid) = (5) już istnieje.

Próbowałem skopiować * nextval ('layer_name_gid_seq' :: regclass) * w polu gid, ale tej sekwencji nie można wkleić w polu gid, ponieważ pole jest zdefiniowane jako numeryczne.

Czy ktoś zna prosty sposób kopiowania elementów z warstwy źródłowej (z istniejącym gid) przypisuje nowy gid?

Dzięki!

hapa
źródło
Jakiej wersji qgis i platformy używasz? Używam QGIS 2.0 w Windows 7 i nie mam problemów z wklejaniem między warstwami postig.
Alexandre Neto,
Czy kiedykolwiek znalazłeś rozwiązanie tego problemu? Mam dokładnie ten sam problem. Nie chcę wstawiać wyzwalacza w PostgreSQL, gdy chodzi o to, aby QGIS nie pobierał wartości domyślnych, gdy nowe funkcje są tworzone przez kopiowanie innych.
Uzyskaj Spatial

Odpowiedzi:

4

Nie jestem w stanie odtworzyć tego w systemie Windows QGIS 2.2, c3a2817.

Jeśli inne wersje zachowują się inaczej lub nadal występuje ten problem, prawdopodobnie możesz ustawić wyzwalacz PostgreSQL na stole jako obejście:

Korzystając z tej przykładowej tabeli:

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

Oto funkcja wyzwalacza, która przypisze nowy w gidrazie potrzeby:

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

Powiązanie funkcji z tabelą ...

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

Spowoduje to automatyczne przypisanie nowych identyfikatorów tam, gdzie gidjuż istnieje. Na przykład następujące zapytanie spowoduje teraz powielenie wszystkich danych w tabeli zamiast niepowodzenia:

INSERT INTO testing (SELECT * FROM testing);

Oczywiście takie podejście może zagrozić intencji twojego klucza podstawowego, więc używaj go ostrożnie.

dbaston
źródło
0

Wybierz obiekty z warstwy źródłowej i zapisz wybrane (Zapisz wybrane jako ...) w pliku kształtu. Dodaj zapisany plik shapefile do projektu QGIS i otwórz tabelę atrybutów, następnie usuń pole „gid” i zapisz plik shapefile. Wybierz funkcje w pliku kształtu i skopiuj je do warstwy roboczej.

spatialhast
źródło
Dziękuję za odpowiedź, ale staram się znaleźć łatwiejszy sposób na zrobienie tego.
hapa
1
jeśli masz tabelę jak gid serial, int i, możesz po prostu wstawić i i automatycznie dostaniesz gid. mam trochę odległej pamięci, że prawdopodobnie jest to w QGIS, ale nie mogę sobie przypomnieć, jak to zrobić
simplexio