MySQL SELECT为存储过程中的NOT NULL列返回NULL

时间:2014-09-16 10:03:34

标签: mysql stored-procedures null

我有一个存储过程,我试图循环遍历表中的多个ID并将它们插入到另一个表中...问题是ID在循环中变为NULL。

出于调试目的,我创建了一个名为test的表,它有两列名为var_namevalue。我还制作了这样的存储过程:

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。 idparentvalue列都是INT(11)。

以下声明:

CALL myProcedure(1);

test

中生成以下结果
+----------+-------+
| var_name | value |
+----------+-------+
| 'parent' | 1     |
| 'id'     | NULL  |
| 'id'     | NULL  |
| 'id'     | NULL  |
| 'id'     | NULL  |
| 'id'     | NULL  |
| 'id'     | NULL  |
+----------+-------+

'id'行的数量与mytableparent = 1的行数匹配,但value始终为NULL。运行以下查询:

SELECT `id` FROM `mytable` WHERE `parent` = 1;

产生预期结果:

+----+
| id |
+----+
| 2  |
| 3  |
| 4  |
| 5  |
| 6  |
| 7  |
+----+

这里发生了什么?

2 个答案:

答案 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之后,包括:

DECLARE id INT;

替换了id ...

mytable的值