Comment éviter les GID en double lors de la copie d'entités d'une couche PostGIS vers une autre?

11

Lorsque j'entre de nouveaux éléments (fonctionnalités) dans un autre calque Postgres, je peux le faire de deux manières:

  1. Dessiner de nouveaux éléments (avec 'Ajouter une fonctionnalité') que je fais rarement ou
  2. Copier (ou couper) certains éléments d'un autre calque Postgre (calque source) et le coller dans le calque cible, ce que je fais fréquemment

Dans le premier exemple, l'enregistrement des modifications fonctionne normalement car cette couche obtient un gid à partir de la séquence de base de données postgre * nextval ('layer_name_gid_seq' :: regclass) *

Dans le deuxième exemple, une erreur s'est produite lors de l'enregistrement des modifications, car lors de la copie de l'élément du calque source vers le calque cible, qg est copié gid de l'élément du calque source. Lorsque vous tentez d'enregistrer des modifications, cette erreur est renvoyée:

Impossible de valider les modifications de la couche «Cjevovodi»
Erreurs: ERREUR: 1 fonctionnalité (s) non ajoutée (s).
Erreurs du fournisseur:
erreur PostGIS lors de l'ajout de fonctionnalités: ERREUR: la valeur de clé en double viole la contrainte unique "cjevovodi_okill_pkey"
DÉTAIL: la clé (gid) = (5) existe déjà.

J'ai essayé de copier * nextval ('layer_name_gid_seq' :: regclass) * dans le champ gid, mais cette séquence ne peut pas être collée dans le champ gid car le champ est défini comme numérique.

Est-ce que quelqu'un connaît un moyen simple de copier des éléments de la couche source (avec un gid existant) pour attribuer un nouveau gid?

Merci!

hapa
la source
Quelle version de qgis et de plateforme utilisez-vous? J'utilise QGIS 2.0 dans Windows 7 et je ne semble pas avoir de problèmes de copier-coller entre les couches postigs.
Alexandre Neto
Avez-vous déjà trouvé une solution à ce problème? Je rencontre exactement le même problème. Je ne veux pas avoir à mettre un déclencheur en place dans PostgreSQL quand il s'agit de QGIS ne tirant pas de valeurs par défaut lorsque de nouvelles fonctionnalités sont créées en copiant d'autres.
Obtenez

Réponses:

4

Je ne suis pas en mesure de reproduire cela dans QGIS 2.2 Windows, c3a2817.

Si d'autres versions se comportent différemment, ou si vous continuez à rencontrer ce problème, vous pouvez probablement configurer un déclencheur PostgreSQL sur la table comme solution de contournement:

En utilisant cet exemple de tableau:

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

Voici une fonction de déclenchement qui en attribuera une nouvelle au gidbesoin:

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

Liaison de la fonction à la table ...

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

Cela attribuera automatiquement de nouveaux ID là où ils gidexistent déjà. Par exemple, la requête suivante va maintenant dupliquer toutes les données de la table au lieu d'échouer:

INSERT INTO testing (SELECT * FROM testing);

Bien sûr, cette approche peut compromettre l'intention de votre clé primaire, utilisez-la donc avec prudence.

dbaston
la source
0

Sélectionnez les entités du calque source et enregistrez la sélection (Enregistrer la sélection sous ...) dans le fichier de formes. Ajoutez le fichier de formes enregistré dans le projet QGIS et ouvrez la table d'attributs, puis supprimez le champ "gid" et enregistrez le fichier de formes. Sélectionnez les entités dans le fichier de formes et copiez-les dans votre couche de travail.

spatialhast
la source
Merci pour votre réponse, mais j'essaie de trouver un moyen plus simple de le faire.
hapa
1
si vous avez une table comme gid serial, int i, vous pouvez simplement insérer i et vous obtenez automatiquement gid. j'ai une mémoire lointaine qu'il est peut-être dans QGIS, mais je ne me souviens pas comment le faire
simplexio