MySQL中的分隔符

我经常看到人们正在使用分隔符。 我试图找出分隔符是什么,它们的目的是什么。 经过20分钟的googleing,我无法找到满足我的答案。 所以,现在我的问题是:什么是分隔符,我应该什么时候使用它们?

除默认值以外的分隔符; 通常在定义函数,存储过程和触发器时使用,其中您必须定义多个语句。 您定义了一个不同的分隔符,如$$ ,用于定义整个过程的结束,但在其内部,单独的语句每个都被终止; 。 这样,当代码在mysql客户端中运行时,客户端可以知道整个过程结束的位置,并将其作为一个单元执行,而不是执行其中的单个语句。

请注意, DELIMITER关键字只是命令行mysql客户端(和一些其他客户端)的函数,而不是常规的MySQL语言功能。 如果您试图通过编程语言API传递给MySQL,它将不起作用。 PHPMyAdmin等其他一些客户端还有其他方法来指定一个非默认的分隔符。

例:

 DELIMITER $$ /* This is a complete statement, not part of the procedure, so use the custom delimiter $$ */ DROP PROCEDURE my_procedure$$ /* Now start the procedure code */ CREATE PROCEDURE my_procedure () BEGIN /* Inside the procedure, individual statements terminate with ; */ CREATE TABLE tablea ( col1 INT, col2 INT ); INSERT INTO tablea SELECT * FROM table1; CREATE TABLE tableb ( col1 INT, col2 INT ); INSERT INTO tableb SELECT * FROM table2; /* whole procedure ends with the custom delimiter */ END$$ /* Finally, reset the delimiter to the default ; */ DELIMITER ; 

尝试将DELIMITER与不支持它的客户端一起使用会导致将其发送到服务器,该服务器将报告语法错误。 例如,使用PHP和MySQLi:

 $mysqli = new mysqli('localhost', 'user', 'pass', 'test'); $result = $mysqli->query('DELIMITER $$'); echo $mysqli->error; 

错误与:

你的SQL语法有错误; 检查对应于您的MySQL服务器版本的手册,在第1行的“DELIMITER $$”附近使用正确的语法

DELIMITER语句将分号(;)的标准分隔符更改为另一个分号。 分隔符从分号(;)更改为双斜杠//。

为什么我们必须改变分隔符?

因为我们希望将存储过程,自定义函数等等作为一个整体传递给服务器,而不是让mysql工具一次解释每条语句。

在创建具有BEGIN … END块的存储例程时,块内的语句以分号(;)结尾。 但是CREATE PROCEDURE语句也需要终止符。 因此,例程体内的分号是否终止了CREATE PROCEDURE,或终止了过程体中的一个语句,这变得模糊不清。

解决歧义的方法是声明一个独特的字符串(不能在过程的主体中出现),以使mysql客户端将其识别为CREATE PROCEDURE语句的真正终结符。