mysql - 无法在 MySQL 的 INSERT 查询中使用当前迭代器值

标签 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 - 列“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/

相关文章:

java - ORA-01843 : not a valid month

php - 如何在mysql存储过程中使用条件

sql - 通过唯一标识符组合查询结果行?

c# - 检查给定日期是否早于 c# 和 mySql 中的当前日期

mysql - 如何使用现有列在表中添加外键而不丢失数据?

mysql查询仅在其他字段存在时才更新字段?

mysql - 具有相同复合键的两个表

mysql - 将一个表与另一表中的元数据合并

c# - 从存储过程返回值并在 C# 中使用它

stored-procedures - DB2-如何创建一个忽略错误的存储过程?