MySQL While语句抛出错误,只插入一条NULL记录

MySQL While Statement throws error and only inserts one record of NULLs

我认为我在下面的 mysql 脚本中编写 WHILE 语句有问题。我已经测试了下面代码的每个单独组件,并且一切都在隔离中工作(没有错误抛出测试输出符合预期),除了 WHILE(抛出错误并仅输入 NULL 值并且仅通过循环的一次迭代)。我正在按照 https://dev.mysql.com/doc/refman/5.7/en/while.html 记录的说明进行操作,但我似乎遗漏了一些东西。我想要做的是在这个 table 中插入几条记录(数百万条)。我究竟做错了什么?为什么这个 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 值放入 table。希望有人能发现我遗漏的东西。提前致谢!

所以有一些错误。首先,正如@Barmar 指出的那样,WHILE 语句仅适用于存储过程。同样正如他指出的那样,我的 select 是错误的(但也没有意义所以我删除了它)。不过还需要做一件事。由于必须创建存储过程,因此还需要将 DELIMITER 设置为 ; 以外的值。下面是正确的代码。

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 的帮助。