为什么在使用复合语句创建EVENT时会发生此错误?

时间:2016-06-15 03:32:32

标签: mysql mysql-event

从此SO question。我对DELIMITER感到困惑。我也尝试过以下内容:

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

这让我误解了提到的问题:

  

错误代码:1064   您的SQL语法有错误;查看与您的MySQL服务器版本相对应的手册,以获得在''附近使用的正确语法。在第5行。

如果我在下面运行sql:

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

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

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

任何帮助都表示赞赏,并提前致谢。

2 个答案:

答案 0 :(得分:2)

您的答案取决于此处的文档21.1 Defining Stored Programs

  

如果使用DELIMITER客户端程序定义包含分号字符的存储程序,则会出现问题。默认情况下,mysql本身将分号识别为语句分隔符,因此您必须临时重新定义分隔符,以使mysql将整个存储的程序定义传递给服务器。

答案 1 :(得分:1)

这是微不足道的,但很难解释。

开箱即用的分隔符是; ...这就是mysql知道语句结束的方式。但是存储过程,事件,函数之类的东西中有很多语句。它需要一个外包装,以便知道它的开始位置和结束位置。

因此,您将开头的分隔符重置为奇怪的内容,例如$$,将$$放在END之后,然后重置回工厂,以便与{{{}}对话1}}

如果没有存储过程,事件,函数和触发器的创建,您将始终提出错误1064。并且你会花很多时间追逐你的尾巴寻找不存在的语法错误。好吧,经常。实际上它缺少;包装器。