mysql 查询临时表列名_为什么mysql会缓存被删除的临时表的列名?
我已经将我的问题简化为这个简单的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会缓存被删除的临时表的列名?相关推荐
- mysql 查询执行过程_深入浅出Mysql(一)——sql查询执行过程
一.sql查询执行过程概括 下面给出的mysql基本架构示意图,从中你可以清楚的mysql的各个模块和执行过程. 大体来说可以分为两部分Server层和储存引擎层.Server层包括连接器.查询缓存. ...
- mysql 查询事务信息_查看MySQL最近的事务执行信息
查看MySQL最近的事务执行信息 发布时间:2020-03-03 12:35:07 来源:51CTO 阅读:103 作者:wjw555 课题:查看MySQL最近的事务执行信息 *虽然我们可以通过查询慢 ...
- mysql 查询字母集合_使用MySQL查询查找所有以字母“ a”,“ b”或“ c”开头的名称?...
您需要使用带有OR运算符的LIKE来查找以a或b或c开头的所有名称.语法如下:SELECT *FROM yourTableName WHERE yourColumnName like 'A%' or ...
- mysql 查询被阻塞_查找MySQL查询语句被阻塞阻塞原因
查询长时间不返回,一般碰到这种情况的话,大概率是表t被锁住了.接下来分析原因的时候,一般都是首先执行一下show processlist命令,看看当前语句处于什么状态. 然后我们再针对每种状态,去分析 ...
- mysql 查询结果转置_转置MySQL查询 – 需要将行放入列中
您需要执行PIVOT操作,MySQL本身不支持该操作(与其他一些RDBMS不同). 最接近的是沿着以下几行构造SQL: SELECT ProductId, GROUP_CONCAT(IF(Name=' ...
- mysql数据库范围之内_是mysql范围
MySQL数据类型-decimal详解 1.首先,对于精度比较高的东西,比如money,我会用decimal类型,不会考虑float,double,因为他们容易产生误差,numeric和decimal ...
- mysql 查询存储过程 速度_查询mysql过程
MySql 使用explain分析查询 今天写了个慢到哭的查询,想用explain分析下执行计划,后来发现explain也是有局限性的: EXPLAIN不会告诉你关于触发器.存储过程的信息或用户自定义 ...
- mysql 临时表 汉字_转MySQL临时表的简单用法
当工作在非常大的表上时,你可能偶尔需要运行很多查询获得一个大量数据的小的子集,不是对整个表运行这些查询,而是让MySQL每次找出所需的少数记录,将记录选择到一个临时表可能更快些,然后在这些表运行查询. ...
- mysql profiling详解_使用mysql profiling功能剖析单条查询
5.1版本开始引入show profile剖析单条语句功能,支持show profiles和show profile语句,参数have_profiling;控制是否开启: 查看是否支持这个功能(查询为 ...
- mysql 查询编码转换_字符集介绍及mysql数据库编码转换
一.字符集介绍: 1.ASCII ASCII是英文American Standard Code for Information Interchange的缩写,美国标准信息交换代码是由美国国家标准学会( ...
最新文章
- 机会!搞科研的同伴注意了,再忙也要看一下!
- php 只能输入中英文,JavaScript基于正则实现控制输入框中只能输入中文、数字和英文的方法...
- 基于canvas绘制的一个跟随鼠标变幻的动态背景线条
- 运维老鸟职场生活交友经验谈
- YbtOJ#763-攻城略池【线段树合并】
- C#操作sql通用类 SQLHelper
- LeetCode 1754. 构造字典序最大的合并字符串
- android 不通过数据线打印日志_人人都可写代码-Android零基础编程-开发调试、APK编译04...
- 别乱用了,这才是 SpringBoot 停机的正确方式!!!
- 在Eclipse中使用JUnit4进行单元测试(上)
- c语言发票的编码,关于增值税发票中商品税收分类编码对应的简称
- 日志分析 批量给指定内容标记颜色 word 文本
- 如何在Vue项目中使用vw实现移动端适配
- Linux 添加中文字体库
- coreldrawx4缩略图显示不出来_CorelDRAW缩略图不显示解决办法
- 华为 2015 机试 输出:数字后面的连续出现的(2个或多个)相同字符(数字或者字符),删去一个,非数字后面的不要删除,例如,对应输出为:33aabb55pin。...
- 上传漏洞靶场:upload-labs 8-13关
- 利用Chrome Edge浏览器调试AndroidWebView
- SQL实现分组排序和组内排序(相同分数并列排名)
- TC Games教你如何在电脑上玩手游梦幻西游,无需模拟器