MySQL的虽然语句引发错误,只是插入空值的一个记录

问题描述 投票:0回答:1

我觉得我做的事情错在下面的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值插入表中。希望有人能发现我错过了什么。提前致谢!

mysql while-loop insert bulkinsert
1个回答
0
投票

所以有一些事情是错误的。首先作为@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的帮助。

© www.soinside.com 2019 - 2024. All rights reserved.