一、前言
一大早上测试环境,发现测试环境的MySQL报错了。
SELECT list is not in GROUP BY clause and contains nonaggregated column
二、解决方案
官方文档中提到:
大致意思:
用于GROUP BY的SQL / 92标准要求满足以下条件:
- SELECT子句的表达式中使用的列必须在GROUP BY子句中。否则,使用该列的表达式是一个聚合函数。
- GROUP BY表达式只能包含选择列表中的列名,而不能仅用作向量聚合的参数。
- 首先执行以下查询:
不出所料就是有一个ONLY_FULL_GROUP_BY
SELECT @@sql_mode;
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
所以我去到配置文件中,在 mysqld
下配置一下 sql_mode
,把 ONLY_FULL_GROUP_BY
去掉
# 添加的行如下
sql_model=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
重启MySQL即可!
可以参考我之前写的一篇文章了解sql_mode
中的每个项的意思:点此跳转链接
三、起因分析
起因是昨天修改一个数据表的结构保存失败出现了报错:
1812 - Tablespace is missing for table database/crm_bid_deposit.
这个错误导致我删除表也删不掉,备份数据库也不行,烦死了。
然后翻遍谷歌,
我做了以下尝试:
- 删除MySQL data目录下对应表的
.ibd
文件,重启MySQL,再去Navicat那边删除对应的表,失败!
- 修改配置项
innodb_file_per_table=0
,重启,执行过以下命令,失败
:
SET FOREIGN_KEY_CHECKS=0;
ALTER TABLE wk_crm_table.wk_crm_bid_deposit DISCARD TABLESPACE;
ALTER TABLE wk_crm_table.wk_crm_bid_deposit IMPORT TABLESPACE;
REPAIR TABLE wk_crm_bid_deposit;
无论我怎么操作,Navicat那边还是看到那个数据表
无奈只能先把innodb_file_per_table=1
设置回来了,重启之后没检查,只看了Navicat中操作的表都没问题,没注意看web应用程序查询是否正常。所以早上来了才发现标题中提到的这个错误。
我这个 Tablespace is missing for table database/crm_bid_deposit.
错误看来只能是等周末再一个个表导出来重建数据库了。有没有人有解决方案,救救我~