Come evitare duplicati GID quando si copiano le funzionalità da un livello PostGIS a un altro?


11

Quando inserisco nuovi elementi (caratteristiche) in un altro livello di Postgres, posso farlo in due modi:

  1. Disegnare nuovi elementi (con 'Aggiungi funzione') che faccio raramente o
  2. Copiare (o tagliare) alcuni elementi da un altro livello Postgre (livello Sorgente) e incollarlo nel livello target che faccio di frequente

Nel primo esempio, il salvataggio delle modifiche funziona normalmente perché questo layer ottiene gid dalla sequenza del database postgre * nextval ('layer_name_gid_seq' :: regclass) *

Nel secondo esempio, ho riscontrato un errore durante il salvataggio delle modifiche, perché durante la copia di un elemento dal livello di origine al livello di destinazione qgis è stato copiato gid dell'elemento dal livello di origine. Quando si tenta di salvare le modifiche, viene restituito questo errore:

Impossibile eseguire il commit delle modifiche al livello „Cjevovodi“
Errori: ERRORE: 1 funzione / i non aggiunta.
Errori del provider:
errore PostGIS durante l'aggiunta di funzioni: ERRORE: il valore della chiave duplicata viola il vincolo univoco "cjevovodi_okill_pkey"
DETTAGLIO: La chiave (gid) = (5) esiste già.

Ho provato a copiare * nextval ('layer_name_gid_seq' :: regclass) * in field gid, ma questa sequenza non può essere incollata in field gid poiché il campo è definito come numerico.

Qualcuno conosce un modo semplice per copiare elementi dal livello sorgente (con gid esistente) assegnare un nuovo gid?

Grazie!


Quale versione di qgis e piattaforma stai usando? Sto usando QGIS 2.0 in Windows 7 e non sembra avere problemi nel copia incolla tra i livelli di Postigs.
Alexandre Neto,

Hai mai trovato una soluzione a questo problema? Sto riscontrando lo stesso identico problema. Non voglio dover attivare un trigger in PostgreSQL quando QGIS non estrae i valori predefiniti quando vengono create nuove funzionalità copiandone altre.
Ottieni Spatial

Risposte:


4

Non sono in grado di riprodurre questo in Windows QGIS 2.2, c3a2817.

Se altre versioni si comportano in modo diverso o se stai continuando ad avere questo problema, puoi probabilmente impostare un trigger PostgreSQL sulla tabella come soluzione alternativa:

Utilizzando questa tabella di esempio:

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

Ecco una funzione di trigger che assegnerà un nuovo giddove necessario:

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

Associare la funzione alla tabella ...

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

Ciò assegnerà automaticamente nuovi ID laddove gidesiste già. Ad esempio, la seguente query ora duplicherà tutti i dati nella tabella invece di fallire:

INSERT INTO testing (SELECT * FROM testing);

Naturalmente, questo approccio può compromettere l'intento della tua chiave primaria, quindi usala attentamente.


0

Seleziona le funzioni dal livello sorgente e salva la selezione (Salva selezione come ...) in shapefile. Aggiungi lo shapefile salvato nel progetto QGIS e apri la tabella degli attributi, quindi elimina il campo "gid" e salva lo shapefile. Seleziona le funzionalità in shapefile e copiale nel tuo livello di lavoro.


Grazie per la tua risposta, ma sto cercando di trovare un modo più semplice per farlo.
hapa,

1
se hai una tabella come gid serial, int i, puoi semplicemente inserire i e ottenere gid automaticamente. ho un po 'di memoria lontana che forse è in QGIS, ma non ricordo come farlo
simplexio
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.