我觉得我做的事情错在下面的MySQL脚本编写WHILE语句。我测试下面的代码的每个单独的部件,一切都在隔离(没有引发测试输出错误匹配期望)的工作原理,除了WHILE(引发错误和输入只有NULL值,并且仅通过循环的一次迭代云)。我下面https://dev.mysql.com/doc/refman/5.7/en/while.html的文件指示,但我似乎失去了一些东西。我想要做的是插入几个记录(百万)到这个表。我究竟做错了什么?为什么会出现这种WHILE语句不循环,为什么它只是将NULL值?
来源
USE wordpress;
SET @i := 0;
WHILE @i < 10 DO
SET @rand_value = CAST(FLOOR(RAND()*10000) as CHAR);
SELECT @rand_value as CONCAT('rand_value at ', CAST(@i as CHAR));
INSERT INTO wp_wpdatatable_1 (jiraissue, assignee, testcasename, description, image, automation, testresult, date, status, priority, os, testtype, location, flavor)
VALUES
(CONCAT('TEST ISSUE ', @rand_value)
, CONCAT('ASSIGNEE ', @rand_value)
, CONCAT('TEST CASE NAME ', @rand_value)
, CONCAT('DESCRIPTION ', @rand_value)
, CONCAT('IMAGE ', @rand_value)
, CONCAT('AUTOMATION ', @rand_value)
, CONCAT('TESTRESULT ', @rand_value)
, CONCAT('DATE ', @rand_value)
, CONCAT('STATUS ', @rand_value)
, CONCAT('PRIORITY ', @rand_value)
, CONCAT('OS ', @rand_value)
, CONCAT('TESTTYPE ', @rand_value)
, CONCAT('LOCATION ', @rand_value)
, CONCAT('FLAVOR ', @rand_value));
SET @i := @i + 1;
END WHILE;
输出
mysql> source /root/populate_wp_wpdatatable_1.sql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
Query OK, 0 rows affected (0.00 sec)
ERROR 1064 (42000): 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 'WHILE @i < 10 DO
SET @rand_value = CAST(FLOOR(RAND()*10000) as CHAR)' at line 1
ERROR 1064 (42000): 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 '('rand_value at ', CAST(@i as CHAR))' at line 1
Query OK, 1 row affected (0.01 sec)
Query OK, 0 rows affected (0.00 sec)
ERROR 1064 (42000): 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 'END WHILE' at line 1
一些奇怪的是,你可以在输出中看到“1行受影响”。所以它实际上是经过一次迭代while循环,但它只做了一次,只放入NULL值插入表中。希望有人能发现我错过了什么。提前致谢!
所以有一些事情是错误的。首先作为@Barmar指出,while语句只有在存储过程。此外,他指出,我的选择是错的(也是毫无意义的,所以我删除了)。有需要尽管一两件事。既然你要创建一个存储过程,你还需要设置分隔符以外的东西。下面是正确的代码。
DELIMITER $$
CREATE PROCEDURE populate_wp_wpdatatable_1(x INT)
BEGIN
SET @i = 0;
WHILE @i < x DO
SET @rand_value = CAST(FLOOR(RAND()*10000) as CHAR);
INSERT INTO wp_wpdatatable_1 (jiraissue, assignee, testcasename, description, image, automation, testresult, date, status, priority, os, testtype, location, flavor)
VALUES
(CONCAT('TEST ISSUE ', @rand_value)
, CONCAT('ASSIGNEE ', @rand_value)
, CONCAT('TEST CASE NAME ', @rand_value)
, CONCAT('DESCRIPTION ', @rand_value)
, CONCAT('IMAGE ', @rand_value)
, CONCAT('AUTOMATION ', @rand_value)
, CONCAT('TESTRESULT ', @rand_value)
, NOW() - INTERVAL FLOOR(RAND() * 365) DAY
, CONCAT('STATUS ', @rand_value)
, CONCAT('PRIORITY ', @rand_value)
, CONCAT('OS ', @rand_value)
, CONCAT('TESTTYPE ', @rand_value)
, CONCAT('LOCATION ', @rand_value)
, CONCAT('FLAVOR ', @rand_value));
SET @i = @i + 1;
END WHILE;
END;
$$
DELIMITER ;
所以啊有趣的东西。再次感谢@Barmar的帮助。