PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 10/04/2020 07:20:37

HeadTrick24
Membre

Mise à jour BD postgres depuis QGIS

Bonjour,

Je souhaite mettre à jour une table dans postgres en mettant à jour ou en insérant de nouvelles entités.

J'arrive à mettre à jour mais je n'arrive pas à insérer.

Voici mon code

update test_importb
             set
             geom = (select geom from test_import where test_importb.id_metier_=test_import.id_metier_),
            type_pf = (select type_pf from test_import where test_importb.id_metier_=test_import.id_metier_);

insert into test_importb select * from test_import where test_importb.id_metier_<>test_import.id_metier_;
end

et le message d'erreur :

update test_importb
             set
             geom = (select geom from test_import where test_importb.id_metier_=test_import.id_metier_),
            type_pf = (select type_pf from test_import where test_importb.id_metier_=test_import.id_metier_);

insert into test_importb select * from test_import where test_importb.id_metier_<>test_import.id_metier_;
end

Hors ligne

#2 10/04/2020 08:11:04

rjuju
Administrateur

Re : Mise à jour BD postgres depuis QGIS

Petite erreur de copier/coller sur le message d'erreur smile

Hors ligne

#3 10/04/2020 08:24:24

HeadTrick24
Membre

Re : Mise à jour BD postgres depuis QGIS

le voici

invalid reference to FROM-clause entry for table "test_importb"
LINE 6: ...f) from test_import where test_import.id_metier_<>test_impor...
                                                             ^
HINT:  There is an entry for table "test_importb", but it cannot be referenced from this part of the query.

Hors ligne

#4 10/04/2020 08:42:25

rjuju
Administrateur

Re : Mise à jour BD postgres depuis QGIS

Effectivement, vous ne pouvez pas écrire la requête comme ça, il faut utiliser un UPDATE ... FROM ... WHERE.  Il y a un exemple d'écriture dans la documentation https://www.postgresql.org/docs/current/sql-update.html

Hors ligne

#5 10/04/2020 11:18:26

HeadTrick24
Membre

Re : Mise à jour BD postgres depuis QGIS

je n'arrive toujours pas à insérer de nouvelles entités

Hors ligne

#6 10/04/2020 13:13:11

pifor
Membre

Re : Mise à jour BD postgres depuis QGIS

Est-ce que cette requête donne le résultat demandé ?

insert into test_importb 
 select test_import.* 
 from test_import, test_importb 
 where test_importb.id_metier_<>test_import.id_metier_;

Pierre

Hors ligne

#7 10/04/2020 13:55:59

HeadTrick24
Membre

Re : Mise à jour BD postgres depuis QGIS

voici le message d'erreur

duplicate key value violates unique constraint "test_importb_pkey"
DETAIL:  Key (gid)=(541) already exists.





En essayant en sélectionnant les colonnes, j'ai une autre erreur
insert into test_importb
select test_import.id_metier_, test_import.type_pf, test_import.geom
from test_import, test_importb
where test_importb.id_metier_<>test_import.id_metier_;


column "gid" is of type integer but expression is of type character varying
LINE 2:  select test_import.id_metier_, test_import.type_pf, test_im...
                ^
HINT:  You will need to rewrite or cast the expression.

Hors ligne

#8 10/04/2020 14:07:03

pifor
Membre

Re : Mise à jour BD postgres depuis QGIS

Pour vous aider, il  faut avoir la description complète des tables concernées, la correspondance entre les colonnes et un exemple de MAJ: quand est-ce qu'il faut la faire et quand est-ce qu'il ne faut pas la faire.

Dernière modification par pifor (10/04/2020 14:07:23)


Pierre

Hors ligne

#9 10/04/2020 19:32:26

dverite
Membre

Re : Mise à jour BD postgres depuis QGIS

Au vu de la tentative du 1er message (qui doit générer une erreur sur l'INSERT, alors que l'UPDATE semble correct):

insert into test_importb select * from test_import where test_importb.id_metier_<>test_import.id_metier_;

l'idée est certainement d'insérer dans test_importb les lignes de test_import dont l'id_metier n'est pas déjà dans la destination.

Ca peut s'écrire:

insert into test_importb select * from test_import where 
 NOT EXISTS (select 1 FROM test_importb WHERE test_importb.id_metier_ = test_import.id_metier_);

Sinon on peut aussi écrire l'UPDATE et l'INSERT combinés dans une seule instruction INSERT avec une clause ON CONFLICT DO UPDATE s'il y a une contrainte unique sur id_metier_, mais c'est un peu plus compliqué à écrire.

Hors ligne

#10 13/04/2020 21:27:26

HeadTrick24
Membre

Re : Mise à jour BD postgres depuis QGIS

Merci pour la requête d'insertion.
Pour l'instant je vais me contenter d'une requête d'insertion et une autre pour les mise à jour.
Je vais creuser pour combiner les deux :-)

Hors ligne

Pied de page des forums