4

誰かが私のコードの構文の何が問題なのか教えてもらえますか? (これは私が強調表示して実行している正確で唯一のコードなので、行番号は一致するはずです)

CREATE TRIGGER `trg_part_upd` AFTER UPDATE ON `tbl_sub_model_eng_trans_part`
 FOR EACH ROW 
    if NEW.engine_sk = 0 and NEW.trans_sk = 0
    then
        UPDATE tbl_sub_model tsm
        INNER JOIN tbl_fct_sub_eng_trans tfset ON tsm.sub_model_sk = tfset.sub_model_sk
        INNER JOIN tbl_sub_model_eng_trans_part tsmetp ON tfset.trans_sk = tsmetp.trans_sk
        SET tsm.last_modified_date = NOW()
        WHERE tsmetp.sub_model_sk=NEW.sub_model_sk;
    end if;

次の 2 つのエラーが表示されます。

エラー コード: 1064。SQL 構文にエラーがあります。9 行目の near '' を使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。

エラー コード: 1064。SQL 構文にエラーがあります。1 行目の「end if」付近で使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。

4

3 に答える 3

11

区切り文字を変更するのを忘れたので、MySQL は最初のステートメントを次のように認識します。

CREATE TRIGGER `trg_part_upd` AFTER UPDATE ON `tbl_sub_model_eng_trans_part`
 FOR EACH ROW 
    if NEW.engine_sk = 0 and NEW.trans_sk = 0
    then
        UPDATE tbl_sub_model tsm
        INNER JOIN tbl_fct_sub_eng_trans tfset ON tsm.sub_model_sk = tfset.sub_model_sk
        INNER JOIN tbl_sub_model_eng_trans_part tsmetp ON tfset.trans_sk = tsmetp.trans_sk
        SET tsm.last_modified_date = NOW()
        WHERE tsmetp.sub_model_sk=NEW.sub_model_sk;

コードの前にこれを追加するだけです:

DELIMITER $$

...そしてこれはその後:

$$

...そのため、MySQL は完全なトリガーを単一のステートメントとして認識できます。

$$自分の選択で変更できます。

公式ドキュメントでは、ストアド プログラムの定義セクションで詳細を説明しています。


この問題は、一度に複数のステートメントを受け入れることができる MySQL クライアントにのみ影響するため、それらを区別するためにセパレーターを実装することに注意してください。DELIMITERmysql コマンドライン ツールのコマンドです。他のクライアントでは実装されている場合と実装されていない場合があります。

于 2012-11-21T11:18:34.947 に答える
1

トリガーはソースオブジェクトであり、本体(1つ以上の内部ステートメント)があります。

  • bodyにステートメントがある場合は、bodyをBEGIN...END句でラップする必要があります。この場合、CREATETRIGGERに対してclientDELIMITERコマンドを使用する必要がある場合もあります。
  • 本文にステートメントが1つある場合は、BEGIN ... ENDなし、およびDELIMITERコマンドなしで構文を使用できます。
于 2012-11-21T12:19:35.777 に答える
1

これを試して:

DELIMITER $$
CREATE TRIGGER `trg_part_upd` AFTER UPDATE ON `tbl_sub_model_eng_trans_part`
 FOR EACH ROW BEGIN 
    IF NEW.engine_sk = 0 AND NEW.trans_sk = 0
    THEN
        UPDATE tbl_sub_model tsm
        INNER JOIN tbl_fct_sub_eng_trans tfset ON tsm.sub_model_sk = tfset.sub_model_sk
        INNER JOIN tbl_sub_model_eng_trans_part tsmetp ON tfset.trans_sk = tsmetp.trans_sk
        SET tsm.last_modified_date = NOW()
        WHERE tsmetp.sub_model_sk=NEW.sub_model_sk;
    END IF;
  END;
$$

DELIMITER ;
于 2012-11-21T11:20:24.147 に答える