我正在使用 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 - 列“name”不能为空
。
列name
在我的INSERT
查询中是第三个。当我将 CONCAT('Device ', @devname)
插入其中时,一切都很好。将其更改为 CONCAT('Device no ', @i)
会失败。
这一定是非常明显的事情,但在过去的两个小时里我一直在努力解决这个问题(我是 MySQL 新手),而且我看不到隧道中的曙光。
最佳答案
指出 9.4. User-Defined Variables 之间的区别很重要(@i
) 和局部变量 13.6.4.1 Local Variable DECLARE Syntax (i
) 是不同的变量。
// `@i` is NULL
... CONCAT('Device no ', @i) ... // CONCAT('Device no ', NULL) = NULL
关于mysql - 无法在 MySQL 的 INSERT 查询中使用当前迭代器值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29415025/