Pages: 1
- Sujet précédent - Mettre à jour une table existante sans l'écraser [PostGIS 2.1] - Sujet suivant
#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
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
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
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
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
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
Pages: 1
- Sujet précédent - Mettre à jour une table existante sans l'écraser [PostGIS 2.1] - Sujet suivant