【问题标题】:Why did this error happened when created EVENT with compound statement?为什么使用复合语句创建 EVENT 时会出现此错误?
【发布时间】:2016-06-15 03:32:32
【问题描述】:

来自这个 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在这里工作。谁能给我解释一下?

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

【问题讨论】:

    标签: mysql mysql-event


    【解决方案1】:

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

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

    【讨论】:

    • 很高兴我能帮上忙 :)
    • 感觉像是一个微不足道的编辑,不是迂腐,我发誓:) 但我在这里引用了mysql,因为它(有点)出现在原文中,试图帮助明确它指的是在每种情况下,客户端实用程序。常见的误解是DELIMITER 被发送到服务器,但实际上它只是一个客户端指令。 +1
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-11-03
      • 2012-11-19
      • 1970-01-01
      • 2023-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多