MySQL出現(xiàn)錯(cuò)誤代碼:1055的三種解決方案(推薦!)
一、 MySQL版本
- MySQL版本:8.0.11
二、 問(wèn)題描述
1. 問(wèn)題描述
- 在查詢時(shí)使用
group by
語(yǔ)句,出現(xiàn)錯(cuò)誤代碼:1055; - 執(zhí)行發(fā)生錯(cuò)誤語(yǔ)句:
SELECT t1.id, t1.`room_name`, t2.`room_id`, t2.`name` FROM room t1 LEFT JOIN person t2 ON t1.id = t2.room_id GROUP BY t1.id
結(jié)果:
- 上圖說(shuō) select表達(dá)式#4-
t2.name
不是聚合函數(shù)列,沒(méi)有依賴group by
子句中的列,所以導(dǎo)致報(bào)錯(cuò)
2.ONLY_FULL_GROUP_BY-SQL示例
- 在MySQL5.7之后
sql_mode
中默認(rèn)存在ONLY_FULL_GROUP_BY
,SQL語(yǔ)句未通過(guò)ONLY_FULL_GROUP_BY
語(yǔ)義檢查所以報(bào)錯(cuò)。 ONLY_FULL_GROUP_BY
:要求select語(yǔ)句中所查詢出的列必須是在group by中進(jìn)行聲明,否則就會(huì)報(bào)錯(cuò)。簡(jiǎn)單的說(shuō)來(lái),在此模式下,select target list中的值要么是來(lái)自于聚合函數(shù)(sum、avg、max等)的結(jié)果,要么是來(lái)自于group by list中的表達(dá)式的值。
-- 執(zhí)行成功,因?yàn)閟elect語(yǔ)句中的count()是聚集函數(shù); SELECT COUNT(1) FROM room t1 LEFT JOIN person t2 ON t1.id = t2.room_id GROUP BY t2.name; -- 執(zhí)行失敗,因?yàn)?中包含主鍵id,而group by后的表達(dá)式中并沒(méi)有包含兩張表中的id SELECT * FROM room t1 LEFT JOIN person t2 ON t1.id = t2.room_id GROUP BY t2.NAME -- 執(zhí)行成功,將上句SQL改為如下: SELECT * FROM room t1 LEFT JOIN person t2 ON t1.id = t2.room_id GROUP BY t1.id, t2.id -- 執(zhí)行成功,因?yàn)閠2.name包含在group by后的表達(dá)式中 SELECT t2.NAME FROM room t1 LEFT JOIN person t2 ON t1.id = t2.room_id GROUP BY t2.NAME -- 該SQL執(zhí)行失敗,因?yàn)閏ontact沒(méi)有包含在group by后的表達(dá)式中 SELECT t2.name, t2.room_id FROM room t1 LEFT JOIN person t2 ON t1.id = t2.room_id GROUP BY t2.name
三、解決辦法
1.方法一
這種方法不需要修改任何配置文件,給不需要分組的字段上加上 any_value()
函數(shù)即可。
any_value
:選擇被分到同一組數(shù)據(jù)中的第一條數(shù)據(jù)的指定列值作為返回?cái)?shù)據(jù)。
示例:
SELECT t2.name, any_value(t2.room_id) AS room_id FROM room t1 LEFT JOIN person t2 ON t1.id = t2.room_id GROUP BY t2.name
當(dāng)然,這種對(duì)于已經(jīng)開(kāi)發(fā)了不少功能的項(xiàng)目不太合適,畢竟要把原來(lái)的sql都給修改一遍
2.方法二(臨時(shí))
這種方法只能暫時(shí)解決1055錯(cuò)誤,當(dāng)MySQL服務(wù)進(jìn)行重啟后就會(huì)失效,又得重新設(shè)置;
查詢出所有的 sql_mode
;
select @@sql_mode
然后將查詢結(jié)果中的ONLY_FULL_GROUP_BY
移除后,再重新設(shè)置sql_model
;
SET sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'
- 操作執(zhí)行完成后就OK了
3.方法三(永久)
- 直接通過(guò)修改MySQL的my.ini文件(如果是Linux則在my.cnf中),這樣就算MySQL服務(wù)重啟后也不會(huì)失效;
在my.ini文件中添加:
# 設(shè)置sql_mode,關(guān)閉ONLY_FULL_GROUP_BY,避免使用group by函數(shù)導(dǎo)致1055錯(cuò)誤 sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
重啟MySQL服務(wù)就OK,以管理員身份打開(kāi)cmd窗口輸入命令(不然可能會(huì)拒絕訪問(wèn));
## 關(guān)閉mysql服務(wù) net stop mysql ## 開(kāi)啟mysql服務(wù) net start mysql
四、sql_mode常用值
- ONLY_FULL_GROUP_BY:在SELECT中的列,沒(méi)有在GROUP BY中出現(xiàn),那么將認(rèn)為這個(gè)SQL是不合法的,因?yàn)榱胁辉贕ROUP BY從句中,即只能展示group by的字段,其他均都要報(bào)1055的錯(cuò);
- STRICT_TRANS_TABLES:在該模式下,如果一個(gè)值不能插入到一個(gè)事務(wù)表中,則中斷當(dāng)前的操作,對(duì)非事務(wù)表不做限制;
- NO_AUTO_VALUE_ON_ZERO:影響自增長(zhǎng)列的插入。默認(rèn)設(shè)置下,插入0或NULL代表生成下一個(gè)自增長(zhǎng)值。如果用戶希望插入的值為0,而該列又是自增長(zhǎng)的,那么這個(gè)選項(xiàng)就有用了。
- NO_ZERO_IN_DATE: 在嚴(yán)格模式下,不接受月或日部分為0的日期。如果使用IGNORE選項(xiàng),我們?yōu)轭愃频娜掌诓迦?rsquo;0000-00-00’。在非嚴(yán)格模式,可以接受該日期,但會(huì)生成警告。
- NO_ZERO_DATE:在嚴(yán)格模式下,mysql數(shù)據(jù)庫(kù)不允許插入零日期。它實(shí)際的行為受到 strictmode是否開(kāi)啟的影響2。
- ERROR_FOR_DIVISION_BY_ZERO:在INSERT或UPDATE過(guò)程中,如果數(shù)據(jù)被零除,則產(chǎn)生錯(cuò)誤而非警告。如果未給出該模式,那么數(shù)據(jù)被零除時(shí)MySQL返回NULL
- NO_AUTO_CREATE_USER:禁止GRANT創(chuàng)建密碼為空的用戶
- NO_ENGINE_SUBSTITUTION:如果需要的存儲(chǔ)引擎被禁用或未編譯,那么拋出錯(cuò)誤。不設(shè)置此值時(shí),用默認(rèn)的存儲(chǔ)引擎替代,并拋出一個(gè)異常
- PIPES_AS_CONCAT:將”||”視為字符串的連接操作符而非或運(yùn)算符,這和Oracle數(shù)據(jù)庫(kù)是一樣的,也和字符串的拼接函數(shù)Concat相類似
- ANSI_QUOTES:?jiǎn)⒂肁NSI_QUOTES后,不能用雙引號(hào)來(lái)引用字符串,因?yàn)樗唤忉尀樽R(shí)別符
以上就是MySQL出現(xiàn)錯(cuò)誤代碼:1055的三種解決方案(推薦!)的詳細(xì)內(nèi)容,更多關(guān)于MySQL錯(cuò)誤代碼1055的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
很全面的Mysql數(shù)據(jù)庫(kù)、數(shù)據(jù)庫(kù)表、數(shù)據(jù)基礎(chǔ)操作筆記(含代碼)
這篇文章主要為大家分享了很全面的Mysql數(shù)據(jù)庫(kù)、數(shù)據(jù)庫(kù)表、數(shù)據(jù)基礎(chǔ)操作筆記,感興趣的小伙伴們可以參考一下2016-04-04MySQL中使用SHOW PROFILE命令分析性能的用法整理
這篇文章主要介紹了MySQL中使用show profile命令分析性能的用法整理,show profiles是數(shù)據(jù)庫(kù)性能優(yōu)化的常用命令,需要的朋友可以參考下2015-11-11innodb存儲(chǔ)引擎修改表共享空間為獨(dú)立空間
最近在優(yōu)化mysql innodb存儲(chǔ)引擎,把共享表空間轉(zhuǎn)換成獨(dú)立表空間,下面是詳細(xì)步驟2014-01-01使用存儲(chǔ)過(guò)程實(shí)現(xiàn)循環(huán)插入100條記錄
本節(jié)主要介紹了使用存儲(chǔ)過(guò)程實(shí)現(xiàn)循環(huán)插入100條記錄的具體實(shí)現(xiàn),需要的朋友可以參考下2014-07-07MySQL中使用case when 語(yǔ)句實(shí)現(xiàn)多條件查詢的方法
今天在一個(gè)應(yīng)用中使用到了一個(gè)比較特殊的數(shù)據(jù)查詢要求。需要的朋友可以參考下。2010-12-12執(zhí)行sql報(bào)錯(cuò)only_full_group_by的2種解決方法
這篇文章主要給大家介紹了關(guān)于執(zhí)行sql報(bào)錯(cuò)only_full_group_by的2種解決方法,報(bào)錯(cuò)only_full_group_by是?MySQL數(shù)據(jù)庫(kù)中的一個(gè)錯(cuò)誤,文中通過(guò)代碼將解決的辦法介紹的非常詳細(xì),需要的朋友可以參考下2024-05-05MySQL數(shù)據(jù)庫(kù)卸載以及刪除所有有關(guān)信息詳細(xì)步驟
在MySQL中數(shù)據(jù)刪除操作不僅僅是簡(jiǎn)單地將某一個(gè)或多個(gè)行刪除,下面這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫(kù)卸載以及刪除所有有關(guān)信息的詳細(xì)步驟,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06mysql 鎖表鎖行語(yǔ)句分享(MySQL事務(wù)處理)
下面這個(gè)語(yǔ)句是鎖定一行數(shù)據(jù),開(kāi)始讀取,一直到刪除后都不會(huì)有第二個(gè)人也讀到這條數(shù)據(jù)2011-09-09