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: 1178
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: 1178
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: 1178
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