Bonjour,
Je suis une novice en SQL qui ai besoin de l'utiliser dans le cadre d'un stage, j'ai donc appris seule et il me manque peut être des bases que je n'ai pas pu prendre le temps d'acquérir par manque de temps... j'ai donc peut être fait des erreurs idiotes et je m'en excuse.
J'ai trois tables pour l'instant : une première table "export_br_oper", et deux autres "lea_agbio_operateur_identification" et "lea_agbio_operateur_geographie".
- La table "export_br_oper" n'a pas de clé primaire ni étrangère et contient des données brutes en vrac.
- Dans la table "lea_agbio_operateur_identification", la clé primaire est "id_operateur"
- Dans la table "lea_agbio_operateur_geographie", la clé primaire est aussi "id_operateur"
- La clé primaire "id_operateur" de la table "lea_agbio_operateur_geographie" est aussi clé étrangère dans la table "lea_agbio_operateur_identification" donc il faut que tous les id présents dans la table "lea_agbio_operateur_geographie"soient d'abord présents dans la table "lea_agbio_operateur_identification" !
J'ai créé deux triggers afin de mettre à jour les données des deux tables "lea_agbio_operateur_identification" et "lea_agbio_operateur_geographie" lorsqu'il y a une importation dans "export_br_oper".
Cependant, quand je fais un test en rajoutant une ligne test dans la table "export_br_oper", j'ai cette erreur :
Comment puis-je régler ce problème ?SQL Error [23503]: ERREUR: une instruction insert ou update sur la table « lea_agbio_operateur_geographie » viole la contrainte de clé étrangère
Détail : La clé (id_operateur)=(test) n'est pas présente dans la table « lea_agbio_operateur_identification ».
Est-il possible de faire quelque chose du style "EXECUTE PROCEDURE fonction1() AND fonction2()" pour rassembler tout ça dans un trigger unique qui met bien les infos dans l'ordre dans les tables (donc exécute d'abord la fonction qui remplit le tableau identification, puis celle qui remplit geographie) ?
Ou bien faut il faire une seule fonction (qui du coup va être très grosse) et qui reprend les deux fonctions que j'ai pour l'instant ? Ou une autre façon de faire à laquelle je n'ai pas pensé ?
Voici ce que j'ai fait pour l'instant comme code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 create or replace function lea_agbio_actu_op_identification() returns trigger as $lea_agbio_actu_op_identification$ begin --liste de toutes les instructions (qui fonctionnaient lors des tests faits avant de rajouter le trigger pour la table geographie) end; $lea_agbio_actu_op_identification$ language plpgsql;et la deuxième fonction :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 drop trigger if exists lea_agbio_actu_op_identification on export_br_oper; CREATE TRIGGER lea_agbio_actu_op_identification after INSERT ON export_br_oper FOR EACH ROW EXECUTE PROCEDURE lea_agbio_actu_op_identification();
deuxième trigger:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 create or replace function lea_agbio_actu_op_geographie() returns trigger as $lea_agbio_actu_op_geographie$ begin --liste d'instructions end; $lea_agbio_actu_op_geographie$ language plpgsql;
Si besoin, je peux fournir les codes internes aux fonctions mais ça ne me semblait pas utile et comme elles sont assez longues, je ne l'ai pas mis là.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 drop trigger if exists lea_agbio_actu_op_geographie on export_br_oper; CREATE TRIGGER lea_agbio_actu_op_geographie after INSERT ON export_br_oper FOR EACH ROW EXECUTE PROCEDURE lea_agbio_actu_op_geographie();
Il y aura 4 tables opérateur différentes ensuite avec d'autres infos, toutes reliées, mais j'imagine que si j'arrive à trouver une solution pour deux tables je trouverais pour quatre tables.
Merci d'avance !
Partager