2016-07-21 2 views
0


J'utilise MySQL 5.1 et Workbench. J'ai besoin de remplir une table t1 à partir de plusieurs tables t2, t3 et t4 lorsque de nouveaux enregistrements sont insérés dans t2 (à partir d'un formulaire externe). J'ai créé un trigger sur t2 (après l'insertion) pour le faire. Cependant, chaque fois que j'ai de nouveaux enregistrements dans t2, il remplit t1 avec tous les enregistrements à nouveau (les nouveaux et les anciens). Ainsi, j'ai essayé de créer un second trigger sur t1 (après insertion) et de supprimer toutes les lignes dans t2, t3 et t4. Le résultat est que le formulaire externe se bloque et ne souhaite plus exporter les données dans t2, t3 et t4. Je suppose que c'est parce qu'il n'y a pas de synchronisation entre les deux déclencheurs, et qu'il peut être utile de supprimer les rangées de t2, t3, t4 en attendant d'insérer ces lignes dans t1. Comment pourrais-je faire autrement?MySQL - exécute un trigger après un autre trigger

Veuillez noter qu'il y a une clé primaire en série sur t1, qui n'est pas identique à t2, t3, t4.

Voici mon premier (INSERT) déclencheur (qui fonctionne):

delimiter | 
CREATE TRIGGER nmp_odk.trigger_maj_baznat AFTER INSERT 
ON nmp_odk.DEMO_OISEAUX12_CORE 
FOR EACH ROW 
BEGIN 
INSERT INTO nmp_baznat_test.OBSERVATION (ID_PROJET,DATE_OBS,PRECISION_DATE,DATE_SAISIE,METHODE_LOCALISATION, CREATION, id_proprietaire,id_structure, 
    CODE_INSEE, ID_SITE, LONGWGS84,LATWGS84, Z, ZPRECISION,CD_DEPARTEMENT, DEPARTEMENT) 

    SELECT PROJET_ID, DATE_OBS, 'date précise', _SUBMISSION_DATE, METHODE_LOC, DATE_OBS, CONTRIB, nmp_odk.DEMO_OISEAUX12_CORE.ID_STRUCTURE, 
      insee_zerofill, NULL as id_site , GPS_TEL_LNG, GPS_TEL_LAT, GPS_TEL_ALT, NULL as alt_precis, code_dept, nom_dept_min 
    FROM nmp_odk.DEMO_OISEAUX12_REPEAT_LOC, nmp_odk.test_insee, nmp_odk.DEMO_OISEAUX12_CORE 
     LEFT JOIN nmp_baznat.AUTEUR 
      ON nmp_baznat.AUTEUR.ID_AUTEUR = nmp_odk.DEMO_OISEAUX12_CORE.CONTRIB 
    WHERE METHODE_LOC = '13' 
    AND nmp_odk.GISWithin(GeomFromText(CONCAT('POINT(',`GPS_TEL_LNG`,' ',`GPS_TEL_LAT`,')')), SHAPE) 
    AND nmp_odk.DEMO_OISEAUX12_CORE._URI = nmp_odk.DEMO_OISEAUX12_REPEAT_LOC._TOP_LEVEL_AURI 

    UNION 

    SELECT PROJET_ID, DATE_OBS, 'date précise', _SUBMISSION_DATE, METHODE_LOC, DATE_OBS, CONTRIB, nmp_odk.DEMO_OISEAUX12_CORE.ID_STRUCTURE, 
      INSEE_zero, ID_SITE, LONG_LIEU_DIT, LAT_LIEU_DIT, Z_LIEU_DIT, ZPRECISION, CD_DEPARTEMENT, DEPARTEMENT 
    FROM nmp_odk.DEMO_OISEAUX12_REPEAT_LOC 
      LEFT JOIN nmp_odk.site_clone 
       ON nmp_odk.site_clone.ID_SITE=nmp_odk.DEMO_OISEAUX12_REPEAT_LOC.SITE_OBS, 
     nmp_odk.DEMO_OISEAUX12_CORE 
      LEFT JOIN nmp_baznat.AUTEUR 
       ON nmp_baznat.AUTEUR.ID_AUTEUR = nmp_odk.DEMO_OISEAUX12_CORE.CONTRIB 
    WHERE METHODE_LOC = '2' 
    AND nmp_odk.DEMO_OISEAUX12_REPEAT_LOC.SITE_OBS is not NULL 
    AND nmp_odk.DEMO_OISEAUX12_CORE._URI = nmp_odk.DEMO_OISEAUX12_REPEAT_LOC._TOP_LEVEL_AURI 
    ; 
END; 
| 
delimiter ; 

Et mon déclencheur SUPPRIMER:

delimiter | 
CREATE TRIGGER nmp_baznat_test.trigger_delete_ODK AFTER INSERT 
ON nmp_baznat_test.OBSERVATION 
FOR EACH ROW 
BEGIN 
DELETE FROM nmp_odk.DEMO_OISEAUX12_REPEAT_OBS; 
DELETE FROM nmp_odk.DEMO_OISEAUX12_CORE ; 
DELETE FROM nmp_odk.DEMO_OISEAUX12_REPEAT_LOC ; 
END; | 
delimiter ; 

Répondre

0

Finalement, je trouve un moyen de résoudre mon problème. Le principal problème était l'absence d'identifiant standard (série) dans la table source (où de nouvelles lignes sont insérées). J'ai donc ajouté une clé série à cette table afin que je puisse utiliser une condition supplémentaire "ET nmp_odk.DEMO_OISEAUX12_CORE.id IN (SELECT max (id) FROM nmp_odk.DEMO_OISEAUX12_CORE)" de sorte que le trigger n'insère que les dernières lignes insérées.