为什么用复合语句创建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.
来自这个 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 causemysql
to pass the entire stored program definition to the server.