我已经将我的问题简化为这个简单的SP。列名在最后被缓存在SELECT *中。我不知道为什么或如何阻止它。我尝试添加SQL_NO_CACHE,但这没有什么区别。

DROP TABLE IF EXISTS foo;

CREATE TABLE foo(

col1 int,

col2 int);

INSERT INTO foo VALUES(1,2),(3,4),(5,6);

DROP PROCEDURE IF EXISTS mysp;

DELIMITER ;;

CREATE DEFINER=root@localhost PROCEDURE mysp(c INT)

BEGIN

DROP TABLE IF EXISTS mydata;

SET @mycol='col1';

IF c > 0 THEN SET @mycol:='col2';

END IF;

SET @s=CONCAT('CREATE TEMPORARY TABLE mydata AS SELECT ', @mycol, ' FROM foo');

PREPARE stmt FROM @s;

EXECUTE stmt;

DEALLOCATE PREPARE stmt;

-- The following select call fails on 2nd and subsequent executions of the SP

SELECT SQL_NO_CACHE * FROM mydata;

SELECT "Please see new temp table mydata" as Result;

END ;;

DELIMITER ;版

mysql> SELECT VERSION();

+------------+

| VERSION() |

+------------+

| 5.5.15-log |

+------------+

1 row in set (0.00 sec)首次运行如预期般运作良好

mysql> CALL mysp(0);

+------+

| col1 |

+------+

| 1 |

| 3 |

| 5 |

+------+

3 rows in set (0.17 sec)

+----------------------------------+

| Result |

+----------------------------------+

| Please see new temp table mydata |

+----------------------------------+

1 row in set (0.17 sec)

Query OK, 0 rows affected (0.17 sec)现在,如果我尝试使用另一列再次运行它

mysql> CALL mysp(1);

ERROR 1054 (42S22): Unknown column 'qlgqp1.mydata.col1' in 'field list'

mysql> SELECT @mycol;

+--------+

| @mycol |

+--------+

| col2 |

+--------+

1 row in set (0.00 sec)如果我再次重新创建存储过程它的作品

mysql> CALL mysp(1);

+------+

| col2 |

+------+

| 2 |

| 4 |

| 6 |

+------+

3 rows in set (0.18 sec)

+----------------------------------+

| Result |

+----------------------------------+

| Please see new temp table mydata |

+----------------------------------+

1 row in set (0.18 sec)

Query OK, 0 rows affected (0.18 sec)但是,如果我尝试切换回第一列 - 即使我先尝试删除临时表 - 它仍然不起作用

mysql> CALL mysp(0);

ERROR 1054 (42S22): Unknown column 'qlgqp1.mydata.col2' in 'field list'

mysql> DROP TABLE mydata;

Query OK, 0 rows affected (0.03 sec)

mysql> CALL mysp(0);

ERROR 1054 (42S22): Unknown column 'qlgqp1.mydata.col2' in 'field list'

mysql>*附加信息请求eggyal。另外我在另一个mysql版本上尝试了这个结果。 *

mysql> CALL mysp(1);

+------+

| col2 |

+------+

| 2 |

| 4 |

| 6 |

+------+

3 rows in set (0.20 sec)

+----------------------------------+

| Result |

+----------------------------------+

| Please see new temp table mydata |

+----------------------------------+

1 row in set (0.20 sec)

Query OK, 0 rows affected (0.20 sec)

mysql> describe mydata;

+-------+---------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+-------+---------+------+-----+---------+-------+

| col2 | int(11) | YES | | NULL | |

+-------+---------+------+-----+---------+-------+

1 row in set (0.00 sec)

mysql> CALL mysp(0);

ERROR 1054 (42S22): Unknown column 'test.mydata.col2' in 'field list'

mysql> describe mydata;

+-------+---------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+-------+---------+------+-----+---------+-------+

| col1 | int(11) | YES | | NULL | |

+-------+---------+------+-----+---------+-------+

1 row in set (0.00 sec)有趣的修补程序开发 - 将最后几行更改为准备好的语句 - 但使用与以前完全相同的查询。

-- The following select call fails on 2nd and subsequent executions of the SP

PREPARE stmt FROM 'SELECT SQL_NO_CACHE * FROM mydata';

EXECUTE stmt;

DEALLOCATE PREPARE stmt;

SELECT "Please see new temp table mydata" as Result;

mysql 查询临时表列名_为什么mysql会缓存被删除的临时表的列名?相关推荐

  1. mysql 查询执行过程_深入浅出Mysql(一)——sql查询执行过程

    一.sql查询执行过程概括 下面给出的mysql基本架构示意图,从中你可以清楚的mysql的各个模块和执行过程. 大体来说可以分为两部分Server层和储存引擎层.Server层包括连接器.查询缓存. ...

  2. mysql 查询事务信息_查看MySQL最近的事务执行信息

    查看MySQL最近的事务执行信息 发布时间:2020-03-03 12:35:07 来源:51CTO 阅读:103 作者:wjw555 课题:查看MySQL最近的事务执行信息 *虽然我们可以通过查询慢 ...

  3. mysql 查询字母集合_使用MySQL查询查找所有以字母“ a”,“ b”或“ c”开头的名称?...

    您需要使用带有OR运算符的LIKE来查找以a或b或c开头的所有名称.语法如下:SELECT *FROM yourTableName WHERE yourColumnName like 'A%' or  ...

  4. mysql 查询被阻塞_查找MySQL查询语句被阻塞阻塞原因

    查询长时间不返回,一般碰到这种情况的话,大概率是表t被锁住了.接下来分析原因的时候,一般都是首先执行一下show processlist命令,看看当前语句处于什么状态. 然后我们再针对每种状态,去分析 ...

  5. mysql 查询结果转置_转置MySQL查询 – 需要将行放入列中

    您需要执行PIVOT操作,MySQL本身不支持该操作(与其他一些RDBMS不同). 最接近的是沿着以下几行构造SQL: SELECT ProductId, GROUP_CONCAT(IF(Name=' ...

  6. mysql数据库范围之内_是mysql范围

    MySQL数据类型-decimal详解 1.首先,对于精度比较高的东西,比如money,我会用decimal类型,不会考虑float,double,因为他们容易产生误差,numeric和decimal ...

  7. mysql 查询存储过程 速度_查询mysql过程

    MySql 使用explain分析查询 今天写了个慢到哭的查询,想用explain分析下执行计划,后来发现explain也是有局限性的: EXPLAIN不会告诉你关于触发器.存储过程的信息或用户自定义 ...

  8. mysql 临时表 汉字_转MySQL临时表的简单用法

    当工作在非常大的表上时,你可能偶尔需要运行很多查询获得一个大量数据的小的子集,不是对整个表运行这些查询,而是让MySQL每次找出所需的少数记录,将记录选择到一个临时表可能更快些,然后在这些表运行查询. ...

  9. mysql profiling详解_使用mysql profiling功能剖析单条查询

    5.1版本开始引入show profile剖析单条语句功能,支持show profiles和show profile语句,参数have_profiling;控制是否开启: 查看是否支持这个功能(查询为 ...

  10. mysql 查询编码转换_字符集介绍及mysql数据库编码转换

    一.字符集介绍: 1.ASCII ASCII是英文American Standard Code for Information Interchange的缩写,美国标准信息交换代码是由美国国家标准学会( ...

最新文章

  1. 机会!搞科研的同伴注意了,再忙也要看一下!
  2. php 只能输入中英文,JavaScript基于正则实现控制输入框中只能输入中文、数字和英文的方法...
  3. 基于canvas绘制的一个跟随鼠标变幻的动态背景线条
  4. 运维老鸟职场生活交友经验谈
  5. YbtOJ#763-攻城略池【线段树合并】
  6. C#操作sql通用类 SQLHelper
  7. LeetCode 1754. 构造字典序最大的合并字符串
  8. android 不通过数据线打印日志_人人都可写代码-Android零基础编程-开发调试、APK编译04...
  9. 别乱用了,这才是 SpringBoot 停机的正确方式!!!
  10. 在Eclipse中使用JUnit4进行单元测试(上)
  11. c语言发票的编码,关于增值税发票中商品税收分类编码对应的简称
  12. 日志分析 批量给指定内容标记颜色 word 文本
  13. 如何在Vue项目中使用vw实现移动端适配
  14. Linux 添加中文字体库
  15. coreldrawx4缩略图显示不出来_CorelDRAW缩略图不显示解决办法
  16. 华为 2015 机试 输出:数字后面的连续出现的(2个或多个)相同字符(数字或者字符),删去一个,非数字后面的不要删除,例如,对应输出为:33aabb55pin。...
  17. 上传漏洞靶场:upload-labs 8-13关
  18. 利用Chrome Edge浏览器调试AndroidWebView
  19. SQL实现分组排序和组内排序(相同分数并列排名)
  20. TC Games教你如何在电脑上玩手游梦幻西游,无需模拟器

热门文章

  1. n条线分平面问题解决方法总结
  2. 145. 超市【小根堆 贪心】
  3. 力扣: 88. 合并两个有序数组
  4. python中使用ElementTree 操作XML
  5. jQuery的效果方法
  6. Select2控件的使用
  7. Session对象的应用
  8. java动态执行逻辑_动态执行代码逻辑
  9. 卧槽!面试官 5 连问一个 TCP 连接可以发多少个 HTTP 请求?
  10. Redis 到底是怎么实现“附近的人”这个功能的?