Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Printemps des cartes 2024

#1 Fri 09 October 2015 12:21

lutinbleu17
Participant occasionnel
Date d'inscription: 30 Sep 2015
Messages: 12

Mettre à jour une table existante sans l'écraser [PostGIS 2.1]

Bonjour à tous,

Je cherche à mettre à jour une table existante dans ma BDD Postgres en y ajoutant de nouveaux enregistrements.
C'est une table contenant le découpage de communes, à laquelle je souhaite ajouter de nouvelles communes (notre zone d'étude s’agrandit).
Je précise que je suis débutant avec PostGIS.

Ma première intuition a été de faire clic droit sur ma table dans pgAdminIII en essayant "script INSERT".
Visiblement c'est plutôt une méthode pour ajouter un enregistrement à une table non spatiale...

Mon deuxième essai a été d'ouvrir DB Manager dans QGis, cliquer sur "Importer une couche vecteur", mais dans l'onglet action, l'option "ajouter des données à une table" reste grisée.
En cherchant sur le net, je ne suis pas le seul à être bloqué avec ce problème : http://forum862.rssing.com/browser.php? … p;item=876

Troisième solution : importer les deux couches dans Qgis et essayer de faire une fusion (merge).
Mais que je passe par vecteur -> outil de gestion des données -> fusionner les shapefiles en un seul
ou alors vecteur -> outil de géotraitement -> regrouper
A chaque fois on me demande un fichier de sortie.
Or je ne veux pas créer un nouveau fichier, je veux mettre à jour une table déjà existante dans PostGIS !

J'espère avoir été clair, et merci pour votre lumière sur le sujet.
Je ne sais même pas si une des trois tentatives était proche de la solution.

Bonne fin de journée !
Charles.

Hors ligne

 

#2 Fri 09 October 2015 12:52

Yves
Membre du bureau
Lieu: Aix-les-Bains
Date d'inscription: 22 Mar 2006
Messages: 9855
Site web

Re: Mettre à jour une table existante sans l'écraser [PostGIS 2.1]

Bonjour,

De mémoire, la case "ajouter des données" n'a pas le code derrière pour faire ce qu'elle est censé faire wink

Sans description de tes tables, cela va rester théorique :

Code:

INSERT INTO matable (col1, col2,col3) VALUES(val1, val2, val3);

Exemple :

Code:

INSERT INTO films 
        VALUES ('UA502', 'Bananas', 105, '1971-07-13', 'Comédie', '82 minutes');

À partir d'une requête existante :

Code:

INSERT INTO matable (col1, col2, col3) VALUES SELECT val1, val2, val3 FROM monautretable;

Tu recherches a priori la dernière requête.

Y.


Yves Jacolin, bénévole de l'association GeoRezo.net, agit au nom et pour le compte de l'association - Partageons ce qui nous départage !!  - GeoRezo vous aide ? Aidez GeoRezo !

Hors ligne

 

#3 Fri 09 October 2015 12:55

jmarsac
Participant assidu
Lieu: NICE
Date d'inscription: 26 Oct 2005
Messages: 567
Site web

Re: Mettre à jour une table existante sans l'écraser [PostGIS 2.1]

Bonjour,

Une méthode (non testée) qui devrait fonctionner:

1- créer un clone de votre table existante

Code:

CREATE TABLE table_nouvelles_communes AS SELECT * FROM table_communes_existantes

2- importer le SHAPE des nouvelles communes dans table_nouvelles_communes

3- mettre à jour votre table_communes_existantes avec

Code:

INSERT INTO table_communes_existantes SELECT * FROM table_nouvelles_communes

Le mieux serait d'avoir une clé primaire sur le code INSEE, et le (3) deviendrait:

Code:

INSERT INTO table_communes_existantes (SELECT * FROM table_nouvelles_communes WHERE code_insee NOT IN SELECT code_insee FROM table_communes_existantes)

Jean-Marie
Azimut

Hors ligne

 

#4 Fri 09 October 2015 14:16

lutinbleu17
Participant occasionnel
Date d'inscription: 30 Sep 2015
Messages: 12

Re: Mettre à jour une table existante sans l'écraser [PostGIS 2.1]

Merci pour vos réponses. Du coup j'ai essayé :

Code:

INSERT INTO public.communes(gid, insee, nom_com, num_dept, geom, supf_com)
SELECT * FROM public.nouvelle_commune

Mais cela me retourne l'erreur suivante :
ERREUR:  la colonne « gid » est de type integer mais l'expression est de type geometry
LINE 1: ... insee, nom_com, num_dept, geom, supf_com) SELECT * FROM pub...
                                                             ^
HINT:  Vous devez réécrire l'expression ou lui appliquer une transformation de type.
********** Erreur **********

ERREUR: la colonne « gid » est de type integer mais l'expression est de type geometry
État SQL :42804
Astuce : Vous devez réécrire l'expression ou lui appliquer une transformation de type.
Caractère : 83

En fait dans ma table initiale de commune le champ gid est rempli automatiquement avec le code suivant :

Code:

gid integer NOT NULL DEFAULT nextval('communes_gid_seq'::regclass),

Hors ligne

 

#5 Fri 09 October 2015 14:56

Lionel B
Participant actif
Lieu: Macon
Date d'inscription: 5 Sep 2005
Messages: 83

Re: Mettre à jour une table existante sans l'écraser [PostGIS 2.1]

bonjour,
le contenu de votre colonne gid est une séquence qui se remplit automatiquement.
Votre requête
SELECT * FROM public.nouvelle_commune
remplit votre table communes en prenant les champs dans l'ordre ou le Select les produit.

Pour éviter ca, vous devriez avoir quelque choses comme

Code:

INSERT INTO public.communes(insee, nom_com, num_dept, geom, supf_com)
SELECT insee, nom_com, num_dept, geom, supf_com FROM public.nouvelle_commune

Dernière modification par Lionel B (Fri 09 October 2015 14:57)

Hors ligne

 

#6 Fri 09 October 2015 15:37

lutinbleu17
Participant occasionnel
Date d'inscription: 30 Sep 2015
Messages: 12

Re: Mettre à jour une table existante sans l'écraser [PostGIS 2.1]

Merci Lionel.
On s'approche, on s'approche.

Cette requête m’envoie une nouvelle erreur :

ERREUR:  INSERT a plus de colonnes cibles que d'expressions
LINE 2:             gid, insee, nom_com, num_dept, geom, supf_com)
                                                         ^
********** Erreur **********

ERREUR: INSERT a plus de colonnes cibles que d'expressions
État SQL :42601
Caractère : 149

Visiblement, le champ gid ne se remplit pas automatiquement quand on insère de nouveaux enregistrements...

Hors ligne

 

#7 Fri 09 October 2015 16:04

Yves
Membre du bureau
Lieu: Aix-les-Bains
Date d'inscription: 22 Mar 2006
Messages: 9855
Site web

Re: Mettre à jour une table existante sans l'écraser [PostGIS 2.1]

Bonjour,

Si, quelle est la requête qui renvoi ce message d'erreur ? je pense que tu as laissé une colonne en trop dans le SELECT.

Y.


Yves Jacolin, bénévole de l'association GeoRezo.net, agit au nom et pour le compte de l'association - Partageons ce qui nous départage !!  - GeoRezo vous aide ? Aidez GeoRezo !

Hors ligne

 

#8 Fri 09 October 2015 16:10

lutinbleu17
Participant occasionnel
Date d'inscription: 30 Sep 2015
Messages: 12

Re: Mettre à jour une table existante sans l'écraser [PostGIS 2.1]

Voilà le code que je tape :

Code:

INSERT INTO public.communes(
            gid, insee, nom_com, num_dept, geom, supf_com)
    SELECT insee, nom_com, num_dept, geom, supf_com FROM public.nouvelle_commune ;

Hors ligne

 

#9 Fri 09 October 2015 16:33

jmarsac
Participant assidu
Lieu: NICE
Date d'inscription: 26 Oct 2005
Messages: 567
Site web

Re: Mettre à jour une table existante sans l'écraser [PostGIS 2.1]

Comme l'a indiqué Lionel B, il faut enlever gid de INSERT

Code:

INSERT INTO public.communes(
            insee, nom_com, num_dept, geom, supf_com)
    SELECT insee, nom_com, num_dept, geom, supf_com FROM public.nouvelle_commune ;

Dernière modification par jmarsac (Fri 09 October 2015 16:39)


Jean-Marie
Azimut

Hors ligne

 

#10 Fri 09 October 2015 16:37

lutinbleu17
Participant occasionnel
Date d'inscription: 30 Sep 2015
Messages: 12

Re: Mettre à jour une table existante sans l'écraser [PostGIS 2.1]

Merci jmarsac ça fonctionne !

Bon week-end à tous

Hors ligne

 

Pied de page des forums

Powered by FluxBB