Vous n'êtes pas identifié(e).
Pages : 1
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
Petite erreur de copier/coller sur le message d'erreur
Julien.
https://rjuju.github.io/
Hors ligne
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
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
Julien.
https://rjuju.github.io/
Hors ligne
je n'arrive toujours pas à insérer de nouvelles entités
Hors ligne
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
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
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
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.
@DanielVerite
http://blog-postgresql.verite.pro/
Hors ligne
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
Pages : 1