相同的查询,不同的结果

时间:2015-10-28 00:27:00

标签: mysql sql

我正在尝试运行一个我首先输入的查询:

DELIMITER $$

DROP PROCEDURE IF EXISTS development $$

CREATE PROCEDURE development()

BEGIN
DECLARE i INT DEFAULT 1;
WHILE i <= 500 DO
IF NOT EXISTS ((SELECT * FROM customers WHERE customerID = 500)) THEN     INSERT INTO customers (firstName) VALUES (''); END IF; 
SET i = i + 1; 
END WHILE; 
END $$

CALL development() $$

DROP PROCEDURE IF EXISTS development $$

DELIMITER ;

然后&#34;压缩&#34;进入这个:

DELIMITER $$ DROP PROCEDURE IF EXISTS development $$ CREATE PROCEDURE development() BEGIN DECLARE i INT DEFAULT 1; WHILE i <= 500 DO IF NOT EXISTS ((SELECT * FROM customers WHERE customerID = 500)) THEN INSERT INTO customers (firstName) VALUES (''); END IF; SET i = i + 1; END WHILE; END $$ CALL development() $$ DROP PROCEDURE IF EXISTS development $$ DELIMITER ;

在一条线上。问题是第一个(多行)代码有效,并且做了它应该做的事情,而另一个(单行)版本没有。它不会失败或抛出错误,它不会像多行版本那样插入行。为什么是这样?更重要的是,如何使单行版本有效?

提前致谢!

2 个答案:

答案 0 :(得分:0)

请这样试试:

DELIMITER $$
DROP PROCEDURE IF EXISTS development $$ CREATE PROCEDURE development() BEGIN DECLARE i INT DEFAULT 1; WHILE i <= 500 DO IF NOT EXISTS ((SELECT * FROM customers WHERE customerID = 500)) THEN INSERT INTO customers (firstName) VALUES (''); END IF; SET i = i + 1; END WHILE; END $$ CALL development() $$ DROP PROCEDURE IF EXISTS development $$
DELIMITER ;

最后一次换行可能不是必要的。

但是我相信,在内联整个代码时,你最终设置的分隔符比“$$”更长。

我刚刚在我的随机sql服务器上执行完全内联的示例,并且总是收到一个肯定的结果,即使我没有设置相关的数据库结构。

有换行符有关于缺少表格的投诉(如预期的那样)

此致 斯蒂芬

答案 1 :(得分:0)

您不能在与delimiter相同的行上运行任何SQL。 delimiter是一个内置的mysql客户端命令,用于设置语句分隔符,而不是sql解释器。它需要一个参数,读取第一个空格或换行符。其他一切都被忽略了。

delimiter $$ select now() $$

没有输出,因为$$之后的所有内容都被丢弃了。

或者通过错误的语法说明

delimiter "$$" select; nothing order by from nowhere group , oh forget it $$