MySQL - 在另一个触发器之后执行一个触发器
MySQL - execute a trigger after another trigger
我使用 MySQL 5.1 和 Workbench。当新记录插入 t2(从外部表单)时,我需要从多个 tables t2、t3 和 t4 中填充一个 table 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 ;
最终,我找到了解决问题的方法。主要问题是源 table(插入新行的位置)中缺少标准 ID(序列号)。因此,我为此 table 添加了一个序列键,以便我可以使用附加条件 "AND nmp_odk.DEMO_OISEAUX12_CORE.id IN (SELECT max(id) FROM nmp_odk.DEMO_OISEAUX12_CORE)",以便触发器仅插入最后插入的行。
我使用 MySQL 5.1 和 Workbench。当新记录插入 t2(从外部表单)时,我需要从多个 tables t2、t3 和 t4 中填充一个 table 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 ;
最终,我找到了解决问题的方法。主要问题是源 table(插入新行的位置)中缺少标准 ID(序列号)。因此,我为此 table 添加了一个序列键,以便我可以使用附加条件 "AND nmp_odk.DEMO_OISEAUX12_CORE.id IN (SELECT max(id) FROM nmp_odk.DEMO_OISEAUX12_CORE)",以便触发器仅插入最后插入的行。