在下面的MySQL代码中,前两个块放下并创建一个临时表 _temp (具有不同的列标签)和选择* 而没有问题。然后,我创建一个执行相同操作的存储过程(即从* _temp 中选择*),它第一次工作,但不是第二次,失败
ERROR 1054(42S22):'字段列表'中的未知列'test._temp.f'
似乎 select * from _temp 可以正确处理表列中的更改,但会在存储过程调用中记住以前的列名称。我做错了什么,或者有解决方法吗?
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'
答案 0 :(得分:2)
将其简化为最小的工作示例,并提取基本元素,搜索错误报告后,这变得更加容易。事实证明,这在2005年被报道为:
标记为副本的一些错误实际上更像是示例:
该错误已关闭,但显然尚未修复,但5.6提到了该行为。根据错误报告中的评论:
在5.6.6更改日志中注明。
"未知栏"更改集合可能导致错误或错误数据 执行期间存储程序中使用的表中的列数 该程序或在程序循环中使用该表时。