Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

Participez à la sélection du programme !

#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: 1176

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

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

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

 

Pied de page des forums

Powered by FluxBB