为什么用复合语句创建EVENT会出现这个错误?

Why did this error happened when created EVENT with compound statement?

来自这个 SO 。我对 DELIMITER 感到困惑。我还尝试了如下操作:

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

这让我像提到的问题一样出错:

Error Code: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 5.

如果我 运行 sql 以下内容:

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

这有效并成功创建了一个新的 EVENT

这两个 sql 之间的唯一区别是最后一个使用 DELIMITER,所以我的问题是为什么 DELIMITER 在这里起作用。谁能给我解释一下?

感谢任何帮助,并提前致谢。

这真的很琐碎,但很难解释。

开箱即用的分隔符是 ; ... 这就是 mysql 知道语句已结束的方式。但是像存储过程、事件、函数之类的东西里面有很多语句。它需要一个外包装,让整个事情知道它从哪里开始,从哪里结束。

因此,您将开头的分隔符重置为一些奇怪的东西,例如 $$,将 $$ 紧跟在 END 之后,然后重置回出厂设置;

在创建存储过程、事件、函数、触发器时,您将一直遇到错误 1064 而没有它。你会浪费很多时间追着尾巴寻找不存在的语法错误。嗯,经常。实际上它缺少 DELIMITER 包装器。

您的答案就在此处的文档中 21.1 Defining Stored Programs

If you use the mysql client program to define a stored program containing semicolon characters, a problem arises. By default, mysql itself recognizes the semicolon as a statement delimiter, so you must redefine the delimiter temporarily to cause mysql to pass the entire stored program definition to the server.