MySQL 5.7升級(jí)8.0報(bào)異常:ONLY_FULL_GROUP_BY的問題解決
異常
MySQL8.0默認(rèn)的SQL模式包含了ONLY_FULL_GROUP_BY,MySQL5.7默認(rèn)的SQL模式也包含了ONLY_FULL_GROUP_BY,但是MySQL5.6是不包含的,有的項(xiàng)目從5.6升級(jí)到5.7的時(shí)候,把SQL模式中的ONLY_FULL_GROUP_BY去掉了,再升級(jí)到8.0時(shí),可能會(huì)報(bào)下面的異常:
Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'java_test.student.subject' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
ONLY_FULL_GROUP_BY
ONLY_FULL_GROUP_BY是MySQL的一個(gè)SQL模式,它要求在使用GROUP BY語(yǔ)句時(shí),SELECT列表、HAVING條件或ORDER BY列表中的每個(gè)列,要么是聚合函數(shù)的一部分(如COUNT(), SUM(), AVG()等),要么必須在GROUP BY子句中明確指定。這一模式的設(shè)計(jì)初衷是增強(qiáng)查詢的準(zhǔn)確性和可預(yù)測(cè)性,避免因?yàn)榱械牟幻鞔_引用而導(dǎo)致的數(shù)據(jù)錯(cuò)誤或不一致。
異常解決
假設(shè)我們有一張student表,包含name(姓名)、subject(科目)、score(分?jǐn)?shù))三個(gè)字段,在ONLY_FULL_GROUP_BY啟用時(shí),我們嘗試運(yùn)行如下查詢,就會(huì)報(bào)上面的異常:
select name, subject, score from student group by name
解決方法有兩個(gè):
1、修改sql
使用聚合函數(shù)處理非GROUP BY列,或?qū)⑵浼尤氲紾ROUP BY子句中,常見的聚合函數(shù)包括SUM(求和)、AVG(平均值)、MAX(最大值)、MIN(最小值)、COUNT(計(jì)數(shù))等。
select name, subject, sum(score) from student group by name, subject
2、修改sql_mode
1)修改當(dāng)前會(huì)話的sql_mode
查看當(dāng)前會(huì)話的sql_mode:
select @@sql_mode; 或者 select @@session.sql_mode;
修改當(dāng)前會(huì)話的sql_mode:
SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); 或者 SET session sql_mode=(SELECT REPLACE(@@session.sql_mode,'ONLY_FULL_GROUP_BY',''));
2)修改全局配置的sql_mode
查看全局配置的sql_mode:
select @@global.sql_mode;
修改全局配置的sql_mode:
SET global sql_mode=(SELECT REPLACE(@@global.sql_mode,'ONLY_FULL_GROUP_BY',''));
3)永久修改sql_mode
若想永久修改sql_mode,需要修改MySQL配置文件(my.cnf或my.ini)
A、打開MySQL配置文件,具體路徑根據(jù)安裝方式和操作系統(tǒng)不同,通常位于:
Linux: /etc/my.cnf 或 /etc/mysql/my.cnf
Windows: C:\ProgramData\MySQL\MySQL Server X.Y\my.ini
使用文本編輯器打開文件
B、找到[mysqld]部分,添加或修改如下行:
[mysqld] sql_mode=新模式
將新模式替換為你希望設(shè)置的值
MySQL配置文件的修改,重啟MySQL服務(wù)后才能生效。
注:
1)建議寫sql時(shí)盡量規(guī)范,在使用GROUP BY語(yǔ)句時(shí),SELECT列表、HAVING條件或ORDER BY列表中的每個(gè)列,要么是聚合函數(shù)的一部分(如COUNT(), SUM(), AVG()等),要么必須在GROUP BY子句中明確指定。
2)當(dāng)我們需要修改sql_mode時(shí),一般情況下,先修改全局配置,再修改配置文件,這樣修改后,即使MySQL服務(wù)重啟后sql_mode也是最新的。
到此這篇關(guān)于MySQL 5.7升級(jí)8.0報(bào)異常:ONLY_FULL_GROUP_BY的問題解決的文章就介紹到這了,更多相關(guān)MySQL 5.7升級(jí)8.0報(bào)異常內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- mysql的group by函數(shù)使用方法
- mysql中的group?by用法指南
- MySQL的GROUP BY與COUNT()函數(shù)的使用方法及常見問題
- mysql中的group?by和between用法詳解
- mysql中的group by高級(jí)用法
- MySQL GROUP BY分組取字段最大值的方法示例
- MySQL中distinct和group by去重的區(qū)別解析
- MySQL中ONLY_FULL_GROUP_BY的使用小結(jié)
- 解決mysql @@sql_mode問題---only_full_group_by
- mysql group by 多個(gè)行轉(zhuǎn)換為一個(gè)字段
相關(guān)文章
mysql5.7使用binlog 恢復(fù)數(shù)據(jù)的方法
MySQL的binlog日志是MySQL日志中非常重要的一種日志,記錄了數(shù)據(jù)庫(kù)所有的DML操作,那么怎樣通過binlog 恢復(fù)數(shù)據(jù),本文就詳細(xì)的來介紹一下2021-06-06
MySQL數(shù)據(jù)庫(kù)事務(wù)隔離級(jí)別介紹(Transaction Isolation Level)
這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)事務(wù)隔離級(jí)別(Transaction Isolation Level) ,需要的朋友可以參考下2014-05-05
mysql中全連接full join...on...的用法說明
這篇文章主要介紹了mysql中全連接full join...on...的用法說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
mysql中的delete,drop和truncate有什么區(qū)別
這篇文章主要介紹了mysql中的delete,drop和truncate有什么區(qū)別,三者的用法和使用場(chǎng)景又完全不同,接下來我們來看看具體的區(qū)別吧,希望對(duì)你的學(xué)習(xí)有所幫助2022-06-06
mysql數(shù)據(jù)庫(kù)優(yōu)化總結(jié)(心得)
本篇文章是對(duì)mysql數(shù)據(jù)庫(kù)優(yōu)化進(jìn)行了詳細(xì)的總結(jié)與介紹,需要的朋友參考下2013-06-06
MySQL 創(chuàng)建多對(duì)多和一對(duì)一關(guān)系方法
這篇文章主要介紹了MySQL 創(chuàng)建多對(duì)多和一對(duì)一關(guān)系方法,文章舉例詳細(xì)說明具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-03-03
mysql數(shù)據(jù)庫(kù)腳本如何為表添加字段并設(shè)置備注
這篇文章主要介紹了mysql數(shù)據(jù)庫(kù)腳本如何為表添加字段并設(shè)置備注方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04

