問題描述:在MySQL數據庫下,執行SQL插入語句報錯。錯誤信息如下:
錯誤原因:在MySQL5.7之后,sql_mode中默認存在ONLY_FULL_GROUP_BY,SQL語句未通過ONLY_FULL_GROUP_BY語義檢查所以報錯。
ONLY_FULL_GROUP_BY:ONLY_FULL_GROUP_BY要求select語句中查詢出來的列必須是明確的(其他語句也是一樣)。
以SQL語句select columes from table group by list為例:columns必須是聚集函數或者在group by后的表達式list中,並且list中必須包含主鍵,否則也會報錯。
insert、update、delete語句都會報錯(但不影響SQL語句的執行),因為這三種語句執行之前也會執行查詢操作。
以主鍵為id的表為例:
SELECT count(1) FROM customer GROUP BY `name`;該SQL執行成功,因為count是聚集函數;
SELECT * FROM customer GROUP BY `name`;該SQL執行失敗,因為*中包含主鍵id,而group by后的表達式中並沒有包含id
SELECT name FROM customer GROUP BY `name`;該SQL執行成功,因為name包含在group by后的表達式中
SELECT name, contact FROM customer GROUP BY `name`;該SQL執行失敗,因為contact沒有包含在group by后的表達式中
解決方案:
一、永久解決
1)在MySQL下執行SELECT @@sql_mode語句
2)將查詢結果中的ONLY_FULL_GROUP_BY去掉然后復制,打開MySQL的配置文件,將sql_mode的值設置為復制的值
(若沒有sql_mode在[mysqld]下方添加一行即可)。
MySQL配置文件所在位置:安裝版可通過windows服務所對應mysql啟動項,查看其對應屬性->可執行文件路徑,獲取my.ini路徑。
免安裝版一般在其根目錄下。(默認是my-default.ini,必須將名字改為my.ini才能生效)
3)重新MySQL服務即可生效
二、只在當前會話中解決,重新進入MySQL后失效
1)在MySQL下執行SELECT @@sql_mode語句
2)將查詢結果中的ONLY_FULL_GROUP_BY去掉然后復制,然后執行set sql_mode = '修改后的值'
三、只在當前服務中解決,重新MySQL服務后失效
1)解決方式同方法二,只是在select和set時添加global關鍵字。具體可查看下圖