无法在 MySQL 的 INSERT 查询中使用当前迭代器值
Can't use current iterator value in MySQL's INSERT query
我正在使用 this answer 中的 MySQL 存储过程来插入许多带有随机数据的行。
当我执行插入仅包含来自我自己变量的值的行的查询时:
DROP PROCEDURE IF EXISTS InsertRand;
DELIMITER $$
CREATE PROCEDURE InsertRand(IN NumRows INT)
BEGIN
DECLARE i INT;
SET i = 1;
START TRANSACTION;
WHILE i <= NumRows DO
SET @devname = CONV(FLOOR(RAND() * 99999999999999), 20, 36);
INSERT INTO `devices` VALUES (NULL, FLOOR(1 + (RAND() * 3)), NULL, CONCAT('Device ', @devname), CONCAT('Description for device ', @devname, '.'), ROUND(RAND()));
SET i = i + 1;
END WHILE;
COMMIT;
END$$
DELIMITER ;
CALL InsertRand(77);
那么一切都很好。但是,当我尝试使用当前迭代器值扩展插入的数据时:
DROP PROCEDURE IF EXISTS InsertRand;
DELIMITER $$
CREATE PROCEDURE InsertRand(IN NumRows INT)
BEGIN
DECLARE i INT;
SET i = 1;
START TRANSACTION;
WHILE i <= NumRows DO
SET @devname = CONV(FLOOR(RAND() * 99999999999999), 20, 36);
INSERT INTO `devices` VALUES (NULL, FLOOR(1 + (RAND() * 3)), NULL, CONCAT('Device no ', @i), CONCAT('Description for device no ', @i, ' and device ID = ', @devname, '.'), ROUND(RAND()));
SET i = i + 1;
END WHILE;
COMMIT;
END$$
DELIMITER ;
CALL InsertRand(77);
然后我得到 #1048 - Column 'name' cannot be null
。
列 name
在我的 INSERT
查询中排在第三位。当我将 CONCAT('Device ', @devname)
推入其中时,一切都很好。将其更改为 CONCAT('Device no ', @i)
会失败。
这一定是非常明显的事情,但过去两个小时我一直在努力解决这个问题(MySQL 我是新手)而且我看不到隧道里的光。
重要的是要指出9.4. User-Defined Variables (@i
) and local variables 13.6.4.1 Local Variable DECLARE Syntax(i
)之间的区别,是不同的变量。
// `@i` is NULL
... CONCAT('Device no ', @i) ... // CONCAT('Device no ', NULL) = NULL
我正在使用 this answer 中的 MySQL 存储过程来插入许多带有随机数据的行。
当我执行插入仅包含来自我自己变量的值的行的查询时:
DROP PROCEDURE IF EXISTS InsertRand;
DELIMITER $$
CREATE PROCEDURE InsertRand(IN NumRows INT)
BEGIN
DECLARE i INT;
SET i = 1;
START TRANSACTION;
WHILE i <= NumRows DO
SET @devname = CONV(FLOOR(RAND() * 99999999999999), 20, 36);
INSERT INTO `devices` VALUES (NULL, FLOOR(1 + (RAND() * 3)), NULL, CONCAT('Device ', @devname), CONCAT('Description for device ', @devname, '.'), ROUND(RAND()));
SET i = i + 1;
END WHILE;
COMMIT;
END$$
DELIMITER ;
CALL InsertRand(77);
那么一切都很好。但是,当我尝试使用当前迭代器值扩展插入的数据时:
DROP PROCEDURE IF EXISTS InsertRand;
DELIMITER $$
CREATE PROCEDURE InsertRand(IN NumRows INT)
BEGIN
DECLARE i INT;
SET i = 1;
START TRANSACTION;
WHILE i <= NumRows DO
SET @devname = CONV(FLOOR(RAND() * 99999999999999), 20, 36);
INSERT INTO `devices` VALUES (NULL, FLOOR(1 + (RAND() * 3)), NULL, CONCAT('Device no ', @i), CONCAT('Description for device no ', @i, ' and device ID = ', @devname, '.'), ROUND(RAND()));
SET i = i + 1;
END WHILE;
COMMIT;
END$$
DELIMITER ;
CALL InsertRand(77);
然后我得到 #1048 - Column 'name' cannot be null
。
列 name
在我的 INSERT
查询中排在第三位。当我将 CONCAT('Device ', @devname)
推入其中时,一切都很好。将其更改为 CONCAT('Device no ', @i)
会失败。
这一定是非常明显的事情,但过去两个小时我一直在努力解决这个问题(MySQL 我是新手)而且我看不到隧道里的光。
重要的是要指出9.4. User-Defined Variables (@i
) and local variables 13.6.4.1 Local Variable DECLARE Syntax(i
)之间的区别,是不同的变量。
// `@i` is NULL
... CONCAT('Device no ', @i) ... // CONCAT('Device no ', NULL) = NULL