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 的帮助。
我认为我在下面的 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 的帮助。