Como evitar GIDs duplicados ao copiar recursos de uma camada PostGIS para outra?


11

Quando insiro novos elementos (recursos) em outra camada do Postgres, posso fazer isso de duas maneiras:

  1. Desenhando novos elementos (com 'Adicionar recurso') que eu raramente ou
  2. Copiando (ou recortando) alguns elementos de outra camada do Postgre (camada de origem) e colando-a na camada de destino, que faço frequentemente

No primeiro exemplo, o salvamento das edições funciona normalmente porque essa camada é gid da sequência do banco de dados postgre * nextval ('layer_name_gid_seq' :: regclass) *

No segundo exemplo, recebi um erro ao salvar edições, porque ao copiar o elemento da camada de origem para a camada de destino, o qgis copiava o gid do elemento da camada de origem. Ao tentar salvar edições, este erro é retornado:

Não foi possível confirmar as alterações na camada „Cjevovodi“
Erros: ERRO: 1 recurso (s) não adicionado.
Erros do provedor:
erro PostGIS ao adicionar recursos: ERRO: o valor duplicado da chave viola a restrição exclusiva "cjevovodi_okill_pkey"
DETALHE: A chave (gid) = (5) já existe.

Tentei copiar * nextval ('layer_name_gid_seq' :: regclass) * no campo gid, mas essa sequência não pode ser colada no campo gid, pois o campo é definido como numérico.

Alguém sabe uma maneira simples de copiar elementos da camada de origem (com gid existente) atribuir novo gid?

Obrigado!


Qual versão do qgis e da plataforma você está usando? Estou usando o QGIS 2.0 no Windows 7 e não parece ter problemas em copiar e colar entre as camadas postigs.
Alexandre Neto

Você já encontrou uma solução para esse problema? Estou encontrando exatamente o mesmo problema. Não quero colocar um gatilho no PostgreSQL quando se trata de o QGIS não extrair valores padrão quando novos recursos são criados, copiando outros.
Obtenha Spatial

Respostas:


4

Não consigo reproduzir isso no QGIS 2.2 Windows, c3a2817.

Se outras versões se comportarem de maneira diferente ou se você continuar com esse problema, provavelmente poderá configurar um gatilho do PostgreSQL na tabela como uma solução alternativa:

Usando esta tabela de exemplo:

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

Aqui está uma função de gatilho que atribuirá uma nova gidquando necessário:

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

Vinculando a função à tabela ...

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

Isso atribuirá automaticamente novos IDs onde os gidjá existem. Por exemplo, a seguinte consulta agora duplicará todos os dados na tabela em vez de falhar:

INSERT INTO testing (SELECT * FROM testing);

Obviamente, essa abordagem pode comprometer a intenção da sua chave primária, portanto, use-a com cuidado.


0

Selecione os recursos da camada de origem e salve os selecionados (Salvar selecionados como ...) no shapefile. Adicione o shapefile salvo no projeto QGIS e abra a tabela de atributos, exclua o campo "gid" e salve o shapefile. Selecione os recursos no shapefile e copie-os na sua camada de trabalho.


Obrigado pela sua resposta, mas estou tentando encontrar uma maneira mais fácil de fazer isso.
hapa

1
se você possui uma tabela como gid serial, int i, você pode simplesmente inserir ie recebe o gid automaticamente. i ter alguma memória distante que é, possivelmente, no QGIS, mas eu não posso recordar howto fazê-lo
simplexio
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.