MySQL - 在另一个触发器之后执行触发器

时间:2016-07-21 10:24:45

标签: mysql triggers insert timing


我使用MySQL 5.1和Workbench。当新记录插入到t2(来自外部表单)时,我需要从多个表t2,t3和t4填充表t1。 我在t2(插入后)创建了一个触发器来执行此操作。但是,每当我在t2中有新记录时,它会再次为t1填充所有记录(新记录和旧记录)。 因此,我尝试在t1上创建第二个触发器(插入后)并删除t2,t3和t4中的所有行。 结果是外部表格崩溃并且不想再将数据导出到t2,t3和t4。 我假设这是因为两个触发器之间没有时间,并且可能从t2,t3,t4删除行,同时将这些行插入到t1中。 我怎么能这样做?

请注意,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 ;

1 个答案:

答案 0 :(得分:1)

最终,我找到了解决问题的方法。主要问题是源表中缺少标准id(序列)(插入新行)。因此,我在此表中添加了一个串行密钥,以便我可以使用附加条件" AND nmp_odk.DEMO_OISEAUX12_CORE.id IN(SELECT max(id)FROM nmp_odk.DEMO_OISEAUX12_CORE)"这样触发器只会插入最后插入的行。