2016-06-15 9 views
0

これよりSO question。私はDELIMITERと混同しています。これは、言及した質問のように私にエラーを得た複合ステートメントでEVENTを作成したときに、このエラーが発生したのはなぜですか?

CREATE EVENT test 
ON SCHEDULE EVERY 2 MINUTE 
DO 
BEGIN 
SELECT 1; 
SELECT 2; 
END 

:そして、私はまた、次のようなものを試してみました

エラーコード:1064あなたは、あなたのSQL構文でエラーが発生している 。ライン5

で「」の近くに使用する権利構文についてはMySQLサーバのバージョンに対応するマニュアルをチェックして、私は、次のSQLを実行した場合:

DELIMITER $$ 
CREATE EVENT test 
ON SCHEDULE EVERY 2 MINUTE 
DO 
BEGIN 
SELECT 1; 
SELECT 2; 
END $$ 
DELIMITER; 

これは、新規に働いて、作成しましたEVENTが正常です。

これら2つのSQLの唯一の違いは、最後に使用されたDELIMITERです。私の質問はなぜDELIMITERがここで機能するかです。誰も私に説明することはできますか?

ご協力いただきありがとうございます。

答えて

1

本当に簡単ですが、説明するのは難しいです。

デリミタは、; ...これは、mysqlがステートメントが終了したことを知る方法です。しかし、ストアドプロシージャ、イベント、関数のようなものには、多くのステートメントがあります。それはどこから始まり、どこで終わるかを知るために、全体のための外部ラッパーが必要です。

だから、あなたは$$のような、奇妙な何かに初めに区切りをリセットし、右END$$は、その後、あなたがエラーを思い付くしようとしている;

にいわば工場出荷時にリセットすることを置きますストアドプロシージャ、イベント、関数、トリガを作成するために必要な時間がなくなります。そしてあなたはあなたの尾を追いかけて多くの時間を費やして、そこにない構文エラーを探します。さて、かなり頻繁に。実際には、DELIMITERラッパーが欠けています。

+0

ありがとうございました。 @Drew – Blank

2

あなたの答えは、ドキュメントにあり、ここで21.1 Defining Stored Programs

あなたはセミコロン文字を含む格納されたプログラムを定義するためにmysqlクライアントプログラムを使用している場合は、問題が発生します。デフォルトでは、mysqlはセミコロンを文区切り文字として認識しますので、区切り文字を一時的に再定義して、mysqlに格納されたプログラム定義全体をサーバーに渡す必要があります。

+0

ありがとうございました。 Upvote! :D – Blank

+0

喜んで私が助けることができました:) –

+0

些細な編集のような気がしない、私は誓います:)しかし、私はここにmysqlを引用しました。それぞれの場合にクライアントユーティリティに参照されます。よくある誤解は、「DELIMITER」がサーバーに送信されているということですが、実際はそれはクライアントの指示に過ぎません。 +1 –

関連する問題