0

从这个 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 之间的唯一区别是最后一个 used DELIMITER,所以我的问题是为什么DELIMITER在这里工作。谁能给我解释一下?

任何帮助表示赞赏并提前感谢。

4

2 回答 2

2

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

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

于 2016-06-15T03:46:56.880 回答
1

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

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

因此,您在开始时将分隔符重置为奇怪的东西,例如$$,将其放在$$之后END,然后重置回工厂可以这么说;

如果没有它,您将一直想出错误 1064 来创建存储过程、事件、函数、触发器。而且您将花费大量时间来寻找不存在的语法错误。嗯,经常。实际上它缺少DELIMITER包装器。

于 2016-06-15T03:46:48.163 回答