MySQL存储过程会记住过时的临时表模式,从而导致未知的列错误

时间:2014-11-28 17:07:39

标签: mysql sql stored-procedures

在下面的MySQL代码中,前两个块放下并创建一个临时表 _temp (具有不同的列标签)和选择* 而没有问题。然后,我创建一个执行相同操作的存储过程(即从* _temp 中选择*),它第一次工作,但不是第二次,失败

  

ERROR 1054(42S22):'字段列表'中的未知列'test._temp.f'

似乎 select * from _temp 可以正确处理表列中的更改,但会在存储过程调用中记住以前的列名称。我做错了什么,或者有解决方法吗?

MySQL代码

drop temporary table if exists _temp;
create temporary table _temp select 'first' as f;
select * from _temp;

drop temporary table if exists _temp;
create temporary table _temp select 'second' as s;
select * from _temp;

drop procedure if exists selectTemp;
create procedure selectTemp()
select * from _temp;

drop temporary table if exists _temp;
create temporary table _temp select 'first' as f;
call selectTemp();

drop temporary table if exists _temp;
create temporary table _temp select 'second' as s;
call selectTemp();

转录

$ mysql --version
mysql  Ver 14.14 Distrib 5.5.38, for debian-linux-gnu (x86_64) using readline 6.2
mysql> source temp.sql
Query OK, 0 rows affected (0.01 sec)

Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

+-------+
| f     |
+-------+
| first |
+-------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 1 row affected (0.01 sec)
Records: 1  Duplicates: 0  Warnings: 0

+--------+
| s      |
+--------+
| second |
+--------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

+-------+
| f     |
+-------+
| first |
+-------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

ERROR 1054 (42S22): Unknown column 'test._temp.f' in 'field list'

1 个答案:

答案 0 :(得分:2)

将其简化为最小的工作示例,并提取基本元素,搜索错误报告后,这变得更加容易。事实证明,这在2005年被报道为:

标记为副本的一些错误实际上更像是示例:

该错误已关闭,但显然尚未修复,但5.6提到了该行为。根据错误报告中的评论:

  

在5.6.6更改日志中注明。

     

"未知栏"更改集合可能导致错误或错误数据   执行期间存储程序中使用的表中的列数   该程序或在程序循环中使用该表时。