我正在使用来自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新手),我看不到隧道中的灯光。
答案 0 :(得分:1)
重要的是要指出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