SQLyog使用DELIMITER分隔符设置结束标记中遇到No query(s)were executed. Please enter a query in the SQL window or place the cursor inside a query问题
MYSQL是一个十分好用的免费数据库软件,普及率非常高。作为MySQL的图形化界面,SQLyog也很受欢迎,但在某些地方SQLyog的语法和MySQL5.5自带的命令提示行还有有所区别。
例如Delimiter这个MySQL自带的分隔符函数(标志语句结束)在MySQL5.5自带的命令提示符中的使用:
十分方便。
然而当你在SQLyog中按照同理依次去执行的每一句话时候就会发现有所不同,会产生以下问题:
MySQL的解释器并不能识别到正在执行的这句话,这其实是因为这虽然是设置分隔符的一句话但是自己本身确没有标识结束。于是我们可以想到可以使用默认的分隔符或者刚刚设置的分隔符$去进行分隔,但当我们去实验之后发现还是产生相同的No query(s)were executed…错误。
经过一番探索后发现SQLyog中的Dlimiter函数可能是类似于局部变量的形式,只在一定范围内生效。于是我改变了编程思路:
DELIMITER $
SELECT * FROM stuinfo$
这样便实现了效果:
鉴于有些初学mysql的朋友可能不知道Delimiter的作用,我使用上述方法写了以下案例:
#案例:批量插入,根据次数插入到admin表中多条记录
DELIMITER $
SELECT * FROM stuinfo$
CREATE PROCEDURE pro_while1(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 1;
WHILE i<=insertCount DO
INSERT INTO admin(username,PASSWORD) VALUES(CONCAT('rose',i),'666');
SET i=i+1;
END WHILE;
END $
CALL pro_while1(20)
要想知道Delimiter的作用,得先知道存储过程和函数是什么:
存储过程和函数可以简单的理解为一条或多条SQL语句的集合。存储过程和函数就是事先经过编译并存储在数据库中的一段SQL语句集合。存储过程和函数执行不是由程序调用,也不是手动启动,而是由事件触发、激活从而实现执行的。
他们的主要区别是函数必须有返回值,而存储过程可以没有。
其作用有三点:
1、提高代码的重用性
2、简化操作
3、减少了编译次数并且减少了数据库服务器的连接次数,提高了效率
在MySQL中不能说毫无作用,只能说十分牛逼,但是如果仍然使用(;)来作为存储过程或函数的分隔符,则会导致MySQL解释器无法甄别到底哪一个分号是单个查询语句的结束,那个分号是存储过程或函数的结束(要么没有执行完全,要么陷入等待)。此时delimiter就起到了重要作用,使用它来标志分隔符,将存储过程或函数用$(自行定义)分隔,其中单行查询用分号隔开便实现了两者的区分。