1. MySQL的ONLY_FULL_GROUP_BY问题深度解析
作为一名长期与MySQL打交道的开发者,我经常遇到同事在执行GROUP BY查询时突然报错的困惑。这个问题在MySQL 5.7.5及以上版本尤为常见,根本原因就是sql_mode中的ONLY_FULL_GROUP_BY设置。让我们先从一个实际案例开始:
假设我们有一个用户反馈表t_iov_help_feedback,结构如下:
sql复制CREATE TABLE `t_iov_help_feedback` (
`ID` INT(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`USER_ID` INT(255) DEFAULT NULL COMMENT '用户ID',
`problems` VARCHAR(255) DEFAULT NULL COMMENT '问题描述',
`last_updated_date` DATETIME DEFAULT NULL COMMENT '最后更新时间',
PRIMARY KEY (`ID`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
当我们尝试执行这样的查询时:
sql复制SELECT ID, USER_ID, problems FROM t_iov_help_feedback GROUP BY USER_ID;
在MySQL 5.7.5+版本中,你会遇到著名的错误1055:
code复制Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column...
1.1 为什么会出现这个错误?
这个问题的根源在于SQL标准的演进。MySQL 5.7.5开始默认启用了ONLY_FULL_GROUP_BY模式,这是SQL-92标准的要求。简单来说,它要求SELECT列表中的每个非聚合列都必须在GROUP BY子句中列出。
这种改变背后的设计哲学是:确保查询结果的确定性。在没有ONLY_FULL_GROUP_BY的情况下,对于未在GROUP BY中列出的列,MySQL会从分组中任意选择值返回,这可能导致不一致的结果。
