2016-07-21 14 views
0


私はMySQL 5.1とWorkbenchを使用します。新しいレコードがt2(外部フォームから)に挿入されると、複数のテーブルt2、t3、t4からテーブルt1を塗りつぶす必要があります。 t2(挿入後)にトリガーを作成しました。しかし、私がt2で新しいレコードを持っているときは、t1にすべてのレコード(新しいものと古いもの)をもう一度埋めます。 したがって、t1(挿入後)に2番目のトリガーを作成し、t2、t3、およびt4のすべての行を削除しようとしました。 その結果、外部フォームがクラッシュし、データをt2、t3、t4にもうエクスポートしたくないという結果になります。 2つのトリガーの間にタイミングがなく、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)"という条件を追加することができます。

関連する問題