簡體   English   中英

MySQL SELECT為存儲過程中的NOT NULL列返回NULL

[英]MySQL SELECT returns NULL for NOT NULL column in stored procedure

我有一個存儲過程,在其中試圖遍歷一個表中的多個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  |
+----+

這里發生了什么?

不太確定給定過程有什么問題,但我嘗試創建一個與您的過程相似的方法,並且效果很好。 這是我做的

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)

我唯一更改的內容是在過程內部使用一個變量來保存參數值並在查詢中使用它。

我在這個問題上撒了點謊。 我真正的存儲過程包含我一開始發布的部分,但是經過了兩次DECLARE,包括:

DECLARE id INT;

替換了mytableid的值...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM