MySQL关于exists的一个bug
今天碰到一个很奇怪的问题,关于exists的,
第一个语句如下:
SELECT
count(1)
FROM
APPLY t
WHERE
EXISTS (
SELECT
r.APPLY_ID
FROM
RECORD r
WHERE
t.APPLY_ID = r.APPLY_ID
);
产生的结果是:89584
第二个语句如下:
SELECT
count(1)
FROM
APPLY t
WHERE
EXISTS (
SELECT
max(r.FINISH_TIME)
FROM
RECORD r
WHERE
t.APPLY_ID = r.APPLY_ID
);
产生的结果是:432382
确实相当奇怪,对于exist子句来说,其判断的是子查询的值是否存在,也就是说,列名,和对列名求最大值没什么区别啊。
包括MySQL官方文档中也提到
Traditionally, an EXISTS subquery starts with SELECT *, but it could begin with SELECT or SELECT column1 or anything at all. MySQL ignores the SELECT list in such a subquery, so it makes no difference.
大意就是MySQL会自动忽略到SELECT的列表。
后来在自己的环境测试了一下,确实是MySQL的一个bug
测试环境:MySQL 5.6.31,5.7.14
mysql> create table t3(id int,t datetime);
Query OK, 0 rows affected (0.44 sec) mysql> insert into t3 values(1,'');
Query OK, 1 row affected (0.16 sec) mysql> select 1 from dual where exists (select id from t3 where id=2);
Empty set (0.15 sec) mysql> select 1 from dual where exists (select max(id) from t3 where id=2);
+---+
| 1 |
+---+
| 1 |
很明显,id等于2的列不存在,但是第二条语句还是当做TRUE来处理了。
也确认了下两条语句的执行计划和改写后的SQL
第一个语句
mysql> EXPLAIN EXTENDED select 1 from dual where exists (select id from t3 where id=2);
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+------------------+
| 1 | PRIMARY | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | Impossible WHERE |
| 2 | SUBQUERY | t3 | NULL | ALL | NULL | NULL | NULL | NULL | 1 | 100.00 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+------------------+
2 rows in set, 2 warnings (0.00 sec) mysql> show warnings;
+---------+------+-------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+-------------------------------------------------------------------+
| Warning | 1681 | 'EXTENDED' is deprecated and will be removed in a future release. |
| Note | 1003 | /* select#1 */ select 1 AS `1` from DUAL where 0 |
+---------+------+-------------------------------------------------------------------+
第二个语句
mysql> EXPLAIN EXTENDED select 1 from dual where exists (select max(id) from t3 where id=2);
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------+
| 1 | PRIMARY | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | No tables used |
| 2 | SUBQUERY | t3 | NULL | ALL | NULL | NULL | NULL | NULL | 1 | 100.00 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------+
2 rows in set, 2 warnings (0.00 sec) mysql> show warnings;
+---------+------+-------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+-------------------------------------------------------------------+
| Warning | 1681 | 'EXTENDED' is deprecated and will be removed in a future release. |
| Note | 1003 | /* select#1 */ select 1 AS `1` from DUAL where 1 |
+---------+------+-------------------------------------------------------------------+
2 rows in set (0.00 sec)
执行计划及改写后的SQL确实有所不同,看来,确实是MySQL的一个bug了。
于是,给官方提了个bug
http://bugs.mysql.com/bug.php?id=82562
总结
建议写exists语句时,子查询中直接用*,而不用对列进行任何函数操作,避免碰到官方bug,
事实上,对于abs,floor函数又没问题
mysql> select 1 from dual where exists (select abs(id) from t3 where id=2);
Empty set (0.07 sec) mysql> select 1 from dual where exists (select floor(id) from t3 where id=2);
Empty set (0.00 sec)
后续
这个确实不是一个bug,这个是符合SQL标准的。
可以参考官方的回复
http://bugs.mysql.com/bug.php?id=82562
MySQL关于exists的一个bug的更多相关文章
- 记录Window系统下myeclipes连接linux下mysql所出现的一个bug
记录myeclipes远程连接mysql所出现的一个bug 今天在玩框架hibernate时,出现一个非常费解的bug,话不多说,先看bug Access denied for user 'root' ...
- MySQL 5.6的一个bug引发的故障
突然收到告警,提示mysql宕机了,该服务器是从库.于是尝试登录服务器看看能否登录,发现可以登录,查看mysql进程也存在,尝试登录提示 ERROR (HY000): Too many connect ...
- 关于MySQL count(distinct) 逻辑的一个bug【转】
本文来自:http://dinglin.iteye.com/blog/1976026#comments 背景 客户报告了一个count(distinct)语句返回结果错误,实际结果存在值,但是用cou ...
- 由一个bug引发的SQLite缓存一致性探索
问题 我们在生产环境中使用SQLite时中发现建表报“table xxx already exists”错误,但DB文件中并没有该表.后面才发现这个是SQLite在实现过程中的一个bug,而这个bug ...
- 本周MySQL官方verified/open的bug列表(11月8日至11月14日)
本周MySQL verified的bug列表(11月8日至11月14日) 1. Bug #70859-DWITH_EXAMPLE_STORAGE_ENGINE=1 is ignored URL ...
- mycat1.5~1.6的一个bug
以下语句在mysql单库中执行正常: SELECT * FROM device WHERE devicetype='AMS.Monitoring.XlCloud.QKL8154.XLCloudDevi ...
- MySQL8.0关于caching_sha2_password Plugin的一个Bug
今天在调试使用ansible进行标准化安装MySQL8.0时,发现关于caching_sha2_password plugin的一个bug. 在搭建主从复制时,按照手册说明需要创建用户: create ...
- mysql 数据库 exists 和count
由于最近在使用exists是出现了一个小问题,但是在调试的时候费了不少时间,因为自己只是牢固造成,所以在在此记录,已提醒自己. mysql中exists 用法: 通过和主查询管理 以达到过滤的效果,如 ...
- 关于mysql使用索引的一个问题
mysql一直号称是免维护的,但是我发现它往往连最表基本索引都不能自动维护,情景如下: 1.我用mysqldump导出一个大表longformh; 2.用mysql.exe导入到一个新库中: 3.查看 ...
随机推荐
- Partition:增加分区
在关系型 DB中,分区表经常使用DateKey(int 数据类型)作为Partition Column,每个月的数据填充到同一个Partition中,由于在Fore-End呈现的报表大多数是基于Mon ...
- webpack的使用
1.webpack是什么? 打包前端项目的工具(为项目提高逼格的东西). 2.webpack的基本命令 webpack#最基本的启动webpack命令 webpack-w #提供watch方法,实时进 ...
- 【原创经验分享】WCF之消息队列
最近都在鼓捣这个WCF,因为看到说WCF比WebService功能要强大许多,另外也看了一些公司的招聘信息,貌似一些中.高级的程序员招聘,都有提及到WCF这一块,所以,自己也关心关心一下,虽然目前工作 ...
- 当web.config文件放置在共享目录下(UNC),启动IIS会提示有错误信息500.19,伴随有错误代码0x80070003和错误代码0x80070005的解决办法
最近遇到一个很有意思的使用环境,操作人员将所有的网站应用内容投放到共享存储里面,并且使用微软的SMB协议将其以CIFS的方式共享出来,使用Windows Server 2008 R2的IIS将其连接起 ...
- Docker与CI持续集成/CD
背景 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制 ...
- iOS之绘制虚线
/* ** lineFrame: 虚线的 frame ** length: 虚线中短线的宽度 ** spacing: 虚线中短线之间的间距 ** co ...
- React Native 之 Text的使用
前言 学习本系列内容需要具备一定 HTML 开发基础,没有基础的朋友可以先转至 HTML快速入门(一) 学习 本人接触 React Native 时间并不是特别长,所以对其中的内容和性质了解可能会有所 ...
- iOS中支付宝集成
iOS中支付宝集成 如今各种的App中都使用了三方支付的功能,现在将我在使用支付宝支付集成过程的心得分享一下,希望对大家都能有所帮助 要集成一个支付宝支付过程的环境,大致需要: 1>公司:先与支 ...
- Atitit.研发管理如何避免公司破产倒闭的业务魔咒
Atitit.如何避免公司破产倒闭的业务魔咒 1. 大型公司的衰落或者倒闭破产案例1 1.1. 摩托罗拉1 1.2. 诺基亚2 1.3. sun2 2. 为什么他们会倒闭?? 常见的一些倒闭元素2 2 ...
- 【AutoMapper官方文档】DTO与Domin Model相互转换(下)
写在前面 AutoMapper目录: [AutoMapper官方文档]DTO与Domin Model相互转换(上) [AutoMapper官方文档]DTO与Domin Model相互转换(中) [Au ...