0

このSOの質問から。と混同しましDELIMITERた。また、次のようなことも試しました。

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

これにより、前述の質問のようなエラーが発生しました:

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

そして、次のSQLを実行した場合:

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

これは機能し、新しいものをEVENT正常に作成しました。

これら 2 つの SQL の唯一の違いは、最後に使用されDELIMITERDELIMITERものです。誰か私に説明できますか?

どんな助けでも大歓迎です、そして前もって感謝します。

4

2 に答える 2

2

あなたの答えはここのドキュメントにあります21.1 ストアドプログラムの定義

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

于 2016-06-15T03:46:56.880 に答える
1

それは本当に些細なことですが、説明するのは難しいです。

デフォルトの区切り文字は;... です。これにより、mysql はステートメントが終了したことを認識します。しかし、ストアド プロシージャ、イベント、関数などには多くのステートメントが含まれています。全体がどこで始まりどこで終わるかを知るには、外側のラッパーが必要です。

したがって、最初の区切り文字を奇妙なものにリセットし、の直後にそれを$$配置してから、いわば工場出荷時の状態にリセットします$$END;

ストアド プロシージャ、イベント、関数、トリガーを作成するためにエラー 1064 がなければ、常にエラー 1064 が発生します。そして、そこにない構文エラーを探して尻尾を追いかけるのに多くの時間を費やすことになります。まあ、かなり頻繁に。実際にはDELIMITERラッパーがありません。

于 2016-06-15T03:46:48.163 に答える