我们写 SQL 的时候,MySQL 怎么判断 SQL 是否已经结束了,可以去执行了?
需要一个结束符,当 MySQL 看到这个结束符的时候,表示可以执行前面的语句了,MySQL 默认以分号为结束符。
当我们创建存储过程或者自定义函数的时候,写了很大一片 SQL,里面包含了很多分号,但是整个代码语句是一个整体,不能让 MySQL 读到分号就立即去执行,这样肯定是不行的。我们需要完整的代码语句一起执行才行。所以此时我们就不可以用分号作为结束符了,必须另外声明结束符。
delimiter
关键字就是用来自定义结束符的,请参考下面的示例:
mysql> /*创建表test1*/
mysql> drop table IF EXISTS test1;
Query OK, 0 rows affected (0.01 sec)
mysql> create table test1(a int PRIMARY KEY,b int);
Query OK, 0 rows affected (0.01 sec)
mysql>
mysql> /*声明脚本的结束符为$$*/
mysql> DELIMITER $$
mysql> DROP PROCEDURE IF EXISTS proc1;
-> CREATE PROCEDURE proc1()
-> BEGIN
-> /*声明了一个局部变量*/
-> DECLARE v_a int;
->
-> select ifnull(max(a),0)+1 into v_a from test1;
-> select @v_b:=v_a*2;
-> insert into test1(a,b) select v_a,@v_b;
-> end $$
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> /*声明脚本的结束符为;*/
mysql> DELIMITER ;
mysql>
mysql> /*调用存储过程*/
mysql> call proc1();
+-------------+
| @v_b:=v_a*2 |
+-------------+
| 2 |
+-------------+
1 row in set (0.00 sec)
Query OK, 1 row affected (0.01 sec)
mysql> /*查看结果*/
mysql> select * from test1;
+---+------+
| a | b |
+---+------+
| 1 | 2 |
+---+------+
1 row in set (0.00 sec)