[英]MySQL SELECT returns NULL for NOT NULL column in stored procedure
我有一個存儲過程,在其中試圖遍歷一個表中的多個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 |
+----+
這里發生了什么?
不太確定給定過程有什么問題,但我嘗試創建一個與您的過程相似的方法,並且效果很好。 這是我做的
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;
替換了mytable
的id
的值...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.