2012-02-10 24 views
0

InnoDBでMySQL 5.5.9で動作します。MySQLトリガー構文エラー

私は、次のトリガーを作成しました:

CREATE TRIGGER TRIGGER_Products_Insert 
AFTER INSERT ON Products 

FOR EACH ROW 
BEGIN 
UPDATE Products 
SET current = 0 
WHERE id = new.id 
    AND current = 1 
    AND autonumber <> new.autonumber 
END; 

MySQLWorkbenchは、最後の行に構文エラーを示しており、これを実行すると、次のエラー

エラーコードスロー:1064あなたがでエラーが発生しているがあなたのSQL構文。右側の構文が行11で 'END'近くで使用するようにMySQLサーバーのバージョンに対応するマニュアルを確認してください。

ここで私のエラー

答えて

2

http://dev.mysql.com/doc/refman/5.5/en/create-trigger.html

DELIMITER | 

CREATE TRIGGER TRIGGER_Products_Insert AFTER INSERT ON Products 
    FOR EACH ROW BEGIN 
     UPDATE Products 
     SET current = 0 
     WHERE id = new.id 
      AND current = 1 
      AND autonumber <> new.autonumber; 
    END; 
| 

DELIMITER ; 
+0

これはうまくいきますが、なぜ「DELIMITER」が必要なのかわかりません。 –

+1

'BEGIN ... END'はトリガの"ボディ "です。したがって、現在のクエリの一部でなければなりません。 ';'はデフォルトで区切り文字であるため、MySQLがそれに達すると、これはクエリの終わりであり、解析できません。また、別の方法で無効になるため、デリミタをトリガの "ボディ"に配置する必要があります。したがって、この要件を満たすためには、トリガーの「本体」とそれ自身の照会に2つの異なる区切り文字を使用する必要があります。申し訳ありませんが、私の英語はあまりにも明白ではない明らかに説明するにはあまりにも悪いです... – Timur

+0

これはここでよりよく説明されています:http://dev.mysql.com/doc/refman/5.5/en/begin-end.html(3段落、 「複数のステートメントを使用するにはクライアントが対応可能でなければならない」というものから始まる) – Timur

0

あなたENDキーワードの前にあなたは;が欠落しています

CREATE TRIGGER TRIGGER_Products_Insert 
AFTER INSERT ON Products 

FOR EACH ROW 
BEGIN 
UPDATE Products 
SET current = 0 
WHERE id = new.id 
    AND current = 1 
    AND autonumber <> new.autonumber; 
END; 
+0

は動作しません、今最後と最後から二番目のラインの両方にエラーが発生します。 –