我有一个存储过程,我试图循环遍历表中的多个ID并将它们插入到另一个表中...问题是ID在循环中变为NULL。
出于调试目的,我创建了一个名为test
的表,它有两列名为var_name
和value
。我还制作了这样的存储过程:
CREATE DEFINER=`root`@`localhost` PROCEDURE `myProcedure`(@parent INT(11))
BEGIN
INSERT INTO `test`
(`var_name`, `value`)
VALUES
('parent', @parent);
INSERT INTO test (`var_name`, `value`)
SELECT 'id', `id`
FROM `mytable`
WHERE `parent` = @parent;
END
表mytable
有很多列,但id
是主键,显然是NOT NULL,parent
允许NULL。 id
,parent
和value
列都是INT(11)。
以下声明:
CALL myProcedure(1);
在test
:
+----------+-------+
| var_name | value |
+----------+-------+
| 'parent' | 1 |
| 'id' | NULL |
| 'id' | NULL |
| 'id' | NULL |
| 'id' | NULL |
| 'id' | NULL |
| 'id' | NULL |
+----------+-------+
'id'行的数量与mytable
中parent
= 1的行数匹配,但value
始终为NULL。运行以下查询:
SELECT `id` FROM `mytable` WHERE `parent` = 1;
产生预期结果:
+----+
| id |
+----+
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
+----+
这里发生了什么?
答案 0 :(得分:1)
不太确定给定程序有什么问题,但我尝试创建一个类似于你的程序,它运作得很好。我在这里做了什么
mysql> create table test (var_name varchar(100),value int);
Query OK, 0 rows affected (0.10 sec)
mysql> create table mytable (id int, parent int);
Query OK, 0 rows affected (0.07 sec)
mysql> insert into mytable values (2,1),(3,1),(4,1),(5,1),(6,1),(7,1);
Query OK, 6 rows affected (0.02 sec)
Records: 6 Duplicates: 0 Warnings: 0
然后添加以下程序
delimiter //
CREATE PROCEDURE myProcedure(parent INT(11))
BEGIN
declare parent_id int ;
set @parent_id := parent ;
INSERT INTO `test`
(`var_name`, `value`)
VALUES
('parent', @parent_id);
INSERT INTO test (`var_name`, `value`)
SELECT 'id', `id`
FROM `mytable`
WHERE `parent` = @parent_id;
END; //
mysql> CALL myProcedure(1);
Query OK, 6 rows affected (0.05 sec)
mysql> select * from test ;
+----------+-------+
| var_name | value |
+----------+-------+
| parent | 1 |
| id | 2 |
| id | 3 |
| id | 4 |
| id | 5 |
| id | 6 |
| id | 7 |
+----------+-------+
7 rows in set (0.00 sec)
我改变的只是在过程中使用一个变量来保存参数值并在查询中使用它。
答案 1 :(得分:0)
DECLARE id INT;
替换了id
...
mytable
的值