可以在MySQL的INSERT查询中使用当前迭代器值

时间:2015-04-02 14:09:18

标签: mysql stored-procedures

我正在使用来自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新手),我看不到隧道中的灯光。

1 个答案:

答案 0 :(得分:1)

重要的是要指出9.4. User-Defined Variables@i)和局部变量13.6.4.1 Local Variable DECLARE Syntaxi)之间的差异,是不同的变量。

// `@i` is NULL
... CONCAT('Device no ', @i) ... // CONCAT('Device no ', NULL) = NULL