2016-10-16 13 views
0

を参照の構文エラー私はMariaDB's Trigger examplesで見つけた非常に基本的なトリガーを実行しようとしている:私は私のクエリで構文エラーをしたので、これは動作しませんMariaDB:古い行

CREATE TRIGGER Books_Delete 
AFTER DELETE ON Books     /* See note (a) */ 
    REFERENCING OLD ROW AS Old   /* See note (b) */ 
FOR EACH ROW       /* See note (c) */ 
    INSERT INTO Books_Deleted_Log 
     VALUES (Old.title);    /* See note (d) */ 

を3行目:REFERENCING OLD ROW ...。一般的に、私はMariaDBやMySQLのために見つけた例は実行できません。ここで何が間違っていますか?私はREFERENCINGの部分は必要ではないが、それもそれなしでは動作しないことを読んだ。私が行うトリガークエリはSQL構文エラーです。これはSQLクライアントとしてDBeaverを使用することに関連していますか?

答えて

1

私は、トリガは、このように見えるように期待:

DELIMITER $$ 

CREATE TRIGGER Books_Delete 
AFTER DELETE ON Books 
FOR EACH ROW 
BEGIN       /* See note (c) */ 
    INSERT INTO Books_Deleted_Log(title) 
     VALUES (Old.title); 
END;$$ 

DELIMITER ; 

REFERENCINGは、MySQLの構文の一部ではありませんが、MariaDB構文の一部です。

+0

MariaDBの公式Wikiによれば、彼らは 'REFERENCING'構文を使用します。 'DELIMITER'構文を避けるためのきれいな方法がありますか?私には、トリガーを実行するたびにデリミタを変更する必要があることが奇妙に感じられます。これは私が欠けている部分であるように見えるので、私の質問は完全に失敗しました。 – CodeShark

+1

@ CodeShark。 。 。コードの "ボディ"があるときはいつでも、 "DELIMITER"を使う必要があります。これは、SQLがセミコロンを定義する方法のために問題になります。セミコロンはステートメントを終了しますが(デフォルトでは)、トリガー、ストアドプロシージャ、またはファンクションには複数のステートメントがあります。 –

+0

テーブルとカラムが存在しない場合、トリガは失敗します。 –