Pages: 1
- Sujet précédent - création de doublons lors de l'insertion des données - PostgreSQL - Sujet suivant
#1 Mon 27 January 2025 09:03
- Andasolo
- Juste Inscrit !
- Lieu: Issoire
- Date d'inscription: 20 Jun 2011
- Messages: 9
création de doublons lors de l'insertion des données - PostgreSQL
Bonjour,
je souhaite insérer des données depuis une table "cana" (couche SIG contenant les collecteurs du réseau d'assainissement, que j'utilise avec QGIS et Lizmap) vers une table "anomalies" sans géométrie, le tout en utilisant PostgreSQL v17. pour cela j'ai créée cette fonction:
Code:
CREATE OR REPLACE FUNCTION f_anomalie_cana()
RETURNS trigger
LANGUAGE 'plpgsql'
COST 100
VOLATILE NOT LEAKPROOF
AS $BODY$
BEGIN
INSERT INTO
anomalies(id_objet,type_objet,type_anomalie,date,heure,anomalie)
select tt.objectid,
(select
t.table_name
from information_schema.tables t
inner join information_schema.columns c on c.table_name = t.table_name and c.table_schema = t.table_schema
where c.column_name = 'anomalie' and t.table_name ='cana'),
case
when tt.anomalie=1 then 'effondrement'
when tt.anomalie=2 then 'racines'
when tt.anomalie=3 then 'fissures'
when tt.anomalie=6 then 'réparée'
when tt.anomalie=7 then 'déplacements d''assemblage'
when tt.anomalie=8 then 'depot'
when tt.anomalie=9 then 'sable'
when tt.anomalie=10 then 'eau stagnante'
when tt.anomalie=11 then 'perforation'
when tt.anomalie=12 then 'eau claire parasite'
when tt.anomalie=17 then 'poinconnement'
when tt.anomalie=18 then 'curage'
else null
end,
current_date,
current_time,
tt.anomalie
from cana tt where tt.anomalie = new.anomalie;
RETURN new;
END;
$BODY$;
et le trigger:
CREATE OR REPLACE TRIGGER trg_anomalie_cana
AFTER INSERT OR UPDATE
ON cana
FOR EACH ROW
EXECUTE FUNCTION f_anomalie_cana();mon problème survient au moment d’insérer des valeurs dans la table "anomalies", puisque la fonction me duplique des valeurs déjà existantes:
objectid,type_objet,id_objet,anomalie,type_anomalie,update_origine,heure,date
51,cana,15382,2,racines,sigadmin,15:32:33.874172+01,2025/01/24
52,cana,31982,2,racines,sigadmin,15:32:33.874172+01,2025/01/24
53,cana,15382,1,effondrement,sigadmin,16:00:10.671524+01,2025/01/24
54,cana,15382,1,effondrement,sigadmin,16:00:22.865349+01,2025/01/24
55,cana,31982,1,effondrement,sigadmin,16:00:22.865349+01,2025/01/24
56,cana,15386,2,racines,sigadmin,"08:53:38.306502+01",2025/01/27
57,cana,15387,2,racines,sigadmin,"08:53:59.924655+01",2025/01/27
58,cana,15386,2,racines,sigadmin,"08:53:59.924655+01",2025/01/27
en vous remerciant par avance de toute votre aide possible (-:
Hors ligne
#2 Tue 28 January 2025 10:09
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1218
Re: création de doublons lors de l'insertion des données - PostgreSQL
Bonjour,
je n'ai peut être pas compris votre intention, mais le code du trigger ne peut-il pas être simplifié comme suit ?
Code:
CREATE OR REPLACE FUNCTION f_anomalie_cana()
RETURNS trigger
LANGUAGE 'plpgsql'
COST 100
VOLATILE NOT LEAKPROOF
AS $BODY$
BEGIN
INSERT INTO
anomalies(id_objet,type_objet,type_anomalie,date,heure,anomalie)
values(
NEW.tt.objectid,
'cana',
case
when NEW.anomalie=1 then 'effondrement'
when NEW.anomalie=2 then 'racines'
when NEW.anomalie=3 then 'fissures'
when NEW.anomalie=6 then 'réparée'
when NEW.anomalie=7 then 'déplacements d''assemblage'
when NEW.anomalie=8 then 'depot'
when NEW.anomalie=9 then 'sable'
when NEW.anomalie=10 then 'eau stagnante'
when NEW.anomalie=11 then 'perforation'
when NEW.anomalie=12 then 'eau claire parasite'
when NEW.anomalie=17 then 'poinconnement'
when NEW.anomalie=18 then 'curage'
else null
end,
current_date,
current_time,
NEW.anomalie
)
;
RETURN new;
END;
$BODY$;Dernière modification par tumasgiu (Tue 28 January 2025 10:09)
Hors ligne
#3 Tue 28 January 2025 13:48
- Andasolo
- Juste Inscrit !
- Lieu: Issoire
- Date d'inscription: 20 Jun 2011
- Messages: 9
Re: création de doublons lors de l'insertion des données - PostgreSQL
Bonjour,
Merci de votre retour. En fait, la couche/table anomalie doit être remplie à chaque fois qu'il y ait une insertion ou une mise à jour des données de la couche "cana". Mais j'ai fini par faire marcher la fonction en faisant ceci;
Code:
CREATE OR REPLACE FUNCTION f_anomalie_cana()
RETURNS trigger
LANGUAGE 'plpgsql'
COST 100
VOLATILE NOT LEAKPROOF
AS $BODY$
BEGIN
INSERT INTO
anomalies(id_objet,type_objet,type_anomalie,date,heure,anomalie)
select tt.objectid,
(select
table_name
from information_schema.tables
where table_name ='cana'),
case
when tt.anomalie=1 then 'effondrement'
when tt.anomalie=2 then 'racines'
when tt.anomalie=3 then 'fissures'
when tt.anomalie=6 then 'réparée'
when tt.anomalie=7 then 'déplacements d''assemblage'
when tt.anomalie=8 then 'depot'
when tt.anomalie=9 then 'sable'
when tt.anomalie=10 then 'eau stagnante'
when tt.anomalie=11 then 'perforation'
when tt.anomalie=12 then 'eau claire parasite'
when tt.anomalie=17 then 'poinconnement'
when tt.anomalie=18 then 'curage'
else null
end,
current_date,
current_time,
tt.anomalie
from cana tt where tt.anomalie = new.anomalie and tt.objectid = new.objectid;
RETURN new;
END;
$BODY$;Hors ligne
#4 Wed 29 January 2025 09:32
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1218
Re: création de doublons lors de l'insertion des données - PostgreSQL
Vous réalisez une jointure sur la table cana dans votre fonction trigger
vous dites à postgresql : à chaque fois qu'il y a une insertion ou une mise à jour sur cana, récupères toutes les lignes de la table cana qui porte sur la même anomalie et le même objet que la ligne en cours d'ajout/mise à jour, et insere les dans la table cana. C'est probablement de la que viennent vos doublons. Si je comprends ce que vous voulez faire vous n'avez pas besoin de faire de select dans le code de votre trigger.
Hors ligne
#5 Fri 31 January 2025 08:44
- Andasolo
- Juste Inscrit !
- Lieu: Issoire
- Date d'inscription: 20 Jun 2011
- Messages: 9
Re: création de doublons lors de l'insertion des données - PostgreSQL
vous dites à postgresql : à chaque fois qu'il y a une insertion ou une mise à jour sur cana, récupères toutes les lignes de la table cana (non pas toutes les lignes, seulement la valeur du champ anomalie) qui porte sur la même anomalie et le même objet que la ligne en cours d'ajout/mise à jour, et inserer les dans la table cana (non, il insère dans la table anomalie).
Dernière modification par Andasolo (Fri 31 January 2025 08:44)
Hors ligne
#6 Fri 31 January 2025 09:30
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1218
Re: création de doublons lors de l'insertion des données - PostgreSQL
Oui, j'ai ecrit un peu trop vite, je m'en excuse. Ce que je voulais dire c'est que votre clause select est suceptible de renvoyer plusieures lignes, et donc sie cela arrive votre clause insert inserera plusieures lignes également.
Hors ligne
#7 Mon 03 February 2025 15:25
- Andasolo
- Juste Inscrit !
- Lieu: Issoire
- Date d'inscription: 20 Jun 2011
- Messages: 9
Re: création de doublons lors de l'insertion des données - PostgreSQL
merci. oui, c'était bien le souci, la clause insert crée des doublons. Pour l'instant, la fonction marche plutôt bien en insérant cette condition: where tt.anomalie = new.anomalie and tt.objectid = new.objectid; et en faisant que le trigger n'agisse que quand le champ anomalie est modifié.
Hors ligne
Pages: 1
- Sujet précédent - création de doublons lors de l'insertion des données - PostgreSQL - Sujet suivant


