2016-07-21 118 views
0


我使用MySQL 5.1和Workbench。當新記錄插入t2(從外部表單)時,我需要從多個表t2,t3和t4填充表t1。 我在t2上創建了一個觸發器(插入後)來這樣做。但是,每當我在t2中創建新記錄時,它將再次填充t1(新的記錄和舊的記錄)。 因此,我嘗試在t1上創建第二個觸發器(插入後),並刪除t2,t3和t4中的所有行。 結果是外部表單崩潰,不想再將數據導出到t2,t3和t4。 我認爲這是因爲兩個觸發器之間沒有時序,並且可能會刪除t2,t3,t4中的行,同時將這些行插入到t1中。 我該怎麼辦?MySQL - 在另一個觸發器之後執行觸發器

請注意,t1上有一個串行主鍵,這在t2,t3,t4中不是一致的。

這裏我第一次(INSERT)觸發器(工作):

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 ; 

我的DELETE觸發器:

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 ; 

回答

0

最終,我找到了一種方法來解決我的問題。主要問題是源表中缺少標準ID(串行)(插入新行)。因此,我在此表中添加了一個序列鍵,以便可以使用附加條件「AND nmp_odk.DEMO_OISEAUX12_CORE.id IN(SELECT max(id)FROM nmp_odk.DEMO_OISEAUX12_CORE)」,以便觸發器只插入最後插入的行。

相關問題