win10系统中 mysql5.7 SELECT list is not in GROUP BY clause and contains nonaggregated column解决

文章指导如何编辑mysql.ini配置文件,特别是添加sql_mode参数以启用更严格的SQL模式,如STRICT_TRANS_TABLES,增强数据库的事务安全性和数据完整性。此外,还提供了配置文件的示例,包括路径设置、端口、字符集等关键选项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在mysql配置文件 mysql.ini 中的

[mysqld]下面添加

sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

之后重启mysql

如果是解压版可能在安装路径中没有mysql.ini,那就手动创建一个配置文件。注意:

basedir=D:\workApp\mysql\mysql-5.7.33-winx64/
datadir=D:\workApp\mysql\mysql-5.7.33-winx64/data/

需要替换为自己的安装路径

[mysql]
default-character-set=utf8

[mysqld]
port=3306
#注意路径是自己的mysql安装路径
basedir=D:\workApp\mysql\mysql-5.7.33-winx64/
datadir=D:\workApp\mysql\mysql-5.7.33-winx64/data/
character-set-server=utf8
default-storage-engine=InnoDB
max_connections=100
collation-server=utf8_unicode_ci
init_connect='SET NAMES utf8'
innodb_buffer_pool_size=64M
innodb_flush_log_at_trx_commit=1
innodb_lock_wait_timeout=120
innodb_log_buffer_size=4M
innodb_log_file_size=256M
interactive_timeout=120
join_buffer_size=2M
key_buffer_size=32M
log_error_verbosity=1
max_allowed_packet=16M
max_heap_table_size=64M
myisam_max_sort_file_size=64G
myisam_sort_buffer_size=32M
read_buffer_size=512kb
read_rnd_buffer_size=4M
server_id=1
skip-external-locking=on
sort_buffer_size=256kb
table_open_cache=256
thread_cache_size=16
tmp_table_size=64M
wait_timeout=120
sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
[client]
port=3306
default-character-set=utf8

### 解决 Linux 系统MySQL 查询时遇到的 GROUP BY 错误 当在 MySQL 8.0 及更高版本执行 `SELECT` 查询并尝试选择未聚合列而不将其放在 `GROUP BY` 子句中时,可能会收到如下错误: ```plaintext ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'jol.solution.nick' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by. ``` 此行为是因为自 MySQL 5.7 起,默认启用了 `ONLY_FULL_GROUP_BY SQL` 模式[^1]。 #### 方法一:修改查询语句 最推荐的方法是对查询本身进行调整。如果确实需要返回非聚集字段,则应确保这些字段要么被适当聚合计数处理过,要么它们的功能依赖于分组键。例如: 假设有一个表名为 `orders` 的订单记录表格,其中包含客户 ID (`customer_id`) 和订单金额 (`amount`) 字段。要获取每位客户的总消费额以及任意一条订单详情(如第一个),可以这样写: ```sql SELECT customer_id, MAX(order_details), SUM(amount) AS total_spent FROM orders GROUP BY customer_id; ``` 这里使用了 `MAX()` 函数来选取每组内的某条特定记录作为代表,从而满足 `ONLY_FULL_GROUP_BY` 的要求[^3]。 #### 方法二:临时禁用 ONLY_FULL_GROUP_BY 如果不希望更改现有查询逻辑,在某些情况下可以选择暂时关闭这个严格的模式设置。可以通过会话级别的命令实现这一点而无需重启数据库服务: ```bash SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); ``` 上述指令仅影响当前连接下的操作环境,并不会改变全局配置文件里的设定,因此对于生产环境中偶尔调试非常有用[^2]。 #### 方法三:永久移除 ONLY_FULL_GROUP_BY 设置 为了使变更持久化适用于所有新建立起来的新客户端链接,可以在 `/etc/my.cnf.d/` 或者其他合适位置编辑 my.cnf 文件,找到 `[mysqld]` 部分加入下面这行代码保存退出即可生效: ```ini [mysqld] sql-mode="" ``` 请注意这样做可能会影响数据一致性和准确性,请谨慎评估后再做决定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值