¿Cómo evitar duplicar GID al copiar características de una capa PostGIS a otra?

11

Cuando ingreso nuevos elementos (características) en otra capa de Postgres, puedo hacerlo de dos maneras:

  1. Dibujar nuevos elementos (con 'Agregar función') que rara vez hago o
  2. Copiar (o cortar) algunos elementos de otra capa de Postgre (capa de origen) y pegarlo en la capa de destino, lo que hago con frecuencia

En el primer ejemplo, el almacenamiento de ediciones funciona normalmente porque esta capa obtiene gid de la secuencia de base de datos postgre * nextval ('layer_name_gid_seq' :: regclass) *

En el segundo ejemplo, recibí un error al guardar las ediciones, porque al copiar el elemento de la capa de origen a la capa de destino, qgis copió gid del elemento de la capa de origen. Al intentar guardar las ediciones, se devuelve este error:

No se pudieron confirmar los cambios en la capa "Cjevovodi"
Errores: ERROR: 1 características no agregadas.
Errores del proveedor:
error PostGIS al agregar características: ERROR: el valor de clave duplicada viola la restricción única "cjevovodi_okill_pkey"
DETALLE: La clave (gid) = (5) ya existe.

Intenté copiar * nextval ('layer_name_gid_seq' :: regclass) * en field gid, pero esta secuencia no se puede pegar en field gid ya que el campo se define como numérico.

¿Alguien sabe una forma sencilla de copiar elementos de la capa de origen (con gid existente) asignar nuevo gid?

¡Gracias!

hapa
fuente
¿Qué versión de qgis y plataforma estás usando? Estoy usando QGIS 2.0 en Windows 7 y parece que no tengo problemas para copiar y pegar entre capas postigs.
Alexandre Neto
¿Alguna vez encontraste solución a este problema? Me encuentro exactamente con el mismo problema. No quiero tener que poner un activador en PostgreSQL cuando se trata de que QGIS no extraiga los valores predeterminados cuando se crean nuevas características copiando otras.
Obtener espacial

Respuestas:

4

No puedo reproducir esto en QGIS 2.2 Windows, c3a2817.

Si otras versiones se comportan de manera diferente, o si continúa teniendo este problema, probablemente pueda configurar un desencadenador PostgreSQL en la tabla como una solución alternativa:

Usando esta tabla de ejemplo:

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

Aquí hay una función de activación que asignará una nueva gidcuando sea necesario:

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 la función a la tabla ...

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

Esto asignará automáticamente nuevas ID donde gidya exista. Por ejemplo, la siguiente consulta ahora duplicará todos los datos en la tabla en lugar de fallar:

INSERT INTO testing (SELECT * FROM testing);

Por supuesto, este enfoque puede comprometer la intención de su clave principal, así que úsela con cuidado.

dbaston
fuente
0

Seleccione entidades de la capa de origen y guarde seleccionado (Guardar seleccionado como ...) en shapefile. Agregue shapefile guardado en el proyecto QGIS y abra la tabla de atributos, luego elimine el campo "gid" y guarde shapefile. Seleccione entidades en shapefile y cópielas en su capa de trabajo.

espacial
fuente
Gracias por su respuesta, pero estoy tratando de encontrar una manera más fácil de hacerlo.
hapa
1
si tiene una tabla como gid serial, int i, simplemente puede insertar i y obtendrá gid automáticamente. Tengo un recuerdo lejano de que posiblemente esté en QGIS, pero no recuerdo cómo hacerlo
simplexio