Mysql only_full_group_by以及其他關於sql_mode原因報錯詳細解決方案

来源:http://www.cnblogs.com/chentging/archive/2017/09/08/7496551.html
-Advertisement-
Play Games

Mysql only_full_group_by以及其他關於sql_mode原因報錯詳細解決方案 網上太多相關資料,但是抄襲嚴重,有的講的也是之言片語的,根本不連貫(可能知道的人確實不想多說) 我總共花了3個多小時,反覆測試,總結一下 Mysql only_full_group_by以及其他關於sq ...


Mysql only_full_group_by以及其他關於sql_mode原因報錯詳細解決方案

網上太多相關資料,但是抄襲嚴重,有的講的也是之言片語的,根本不連貫(可能知道的人確實不想多說)
我總共花了3個多小時,反覆測試,總結一下

報錯信息:

1.ERROR 1055 (42000): Expression #7 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'postscan.verifyDelayLog.auditor' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

原因:

1.mysql 5.7中的sql_mode的值為:2.ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

怎麼查看呢:

1.我的mysql5.7部署在linux上的,然後我使用navicat 12連接的,就說怎麼使用navicat 12查看吧2.使用navicat 打開資料庫,然後工具-->命令列界面 (快捷方式F63.然後輸入:SELECT @@sql_mode;4.看到值為:5.ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

解決辦法1:

1.我所使用的mysql運行時指定的配置如下:2./apps/mysql5.7.18/bin/mysqld --defaults-file=/apps/my3306.cnf --basedir=/apps/mysql5.7.18 --datadir=/apps/mysql/data/3306 --plugin-dir=/apps/mysql5.7.18/lib/mysql/plugin --user=mysql --log-error=/apps/mysql/data/3306/BJ-DYC-VM-5-106.err --open-files-limit=8192 --pid-file=/apps/mysql/data/3306/BJ-DYC-VM-5-106.pid --socket=/tmp/mysql_3306.sock --port=33063.4.那麼我修改的是/apps/my3306.cnf,你沒意見吧哈哈5.找到:6.sql_mode = "ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"7.8.修改為:9.sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"10.11.因為修改了mysql配置文件,所以重新啟動mysql12./apps/mysql5.7.18/bin/mysqld --defaults-file=/apps/my3306.cnf --basedir=/apps/mysql5.7.18 --datadir=/apps/mysql/data/3306 --plugin-dir=/apps/mysql5.7.18/lib/mysql/plugin --user=mysql --log-error=/apps/mysql/data/3306/BJ-DYC-VM-5-106.err --open-files-limit=8192 --pid-file=/apps/mysql/data/3306/BJ-DYC-VM-5-106.pid --socket=/tmp/mysql_3306.sock --port=3306

驗證一下:

1.進入命令列界面2.然後輸入:SELECT @@sql_mode;3.看到值為:4.STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION5.6.至此,你不用遵守:如下約定了:7.  對於GROUP BY聚合操作,如果在SELECT中的列,沒有在GROUP BY中出現,那麼這個SQL是不合法的,因為列不在GROUP BY從句中,所以對於設置了這個mode的資料庫,在使用group by 的時候,就要用MAX(),SUM(),ANT_VALUE()這種聚合函數,才能完成GROUP BY 的聚合操作。

解決辦法2

1.第二種辦法不用修改配置文件,使用navicat修改2.進入命令行界面(F6)3.輸入:SELECT @@GLOBAL.sql_mode;4.結果:ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION5.6.然後我們來修改sql_mode7.輸入:set GLOBAL sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION ';8.9.再運行你的sql:10.SELECT11.     id,ip12.FROM13.     ip_meta_backup14.GROUP BY15.     ip16.HAVING17.     count(ip) > 118.*****恭喜你,成功了*****19.20.21.22.然後你再運行你的sql是不是可以運行啦23.24.SET GLOBAL sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';25.26.SELECT @@GLOBAL.sql_mode;

解決辦法3

1.第三種辦法不用修改配置文件,使用navicat修改2.進入命令行界面(F6)3.輸入:SELECT @@sql_mode;              註意:這邊預設了session,完整的是:SELECT @@SESSION.sql_mode;4.結果:ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION5.6.然後我們來修改sql_mode7.輸入:set SESSION sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION ';8.9.再運行你的sql:10.SELECT11.     id,ip12.FROM13.     ip_meta_backup14.GROUP BY15.     ip16.HAVING17.     count(ip) > 118.*****還是報only_full_group_by錯*****19.20.##############解決方法###################21.22.在你查詢的語句之前set sql_mode23.24.set SESSION sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION ';25.SELECT26.     id,ip27.FROM28.     ip_meta_backup29.GROUP BY30.     ip31.HAVING32.     count(ip) > 133.以後再新建查詢(包含group by)語句也不用再加set sql_mode 直到你關閉這次連接為止34.35.36.37.38.然後你再運行你的sql是不是可以運行啦39.40.SET GLOBAL sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';41.42.SELECT @@GLOBAL.sql_mode;

對於辦法3解決的解釋

1.其實講第三種方法的時候說過SELECT @@sql_mode;  其實這邊預設了session,完整的是:SELECT @@SESSION.sql_mode;2.SESSION是當前會話的意思---->這句話就解釋了直到你關閉這次連接為止3.4.那為什麼在命令行set sql_mode,然後再新建查詢還是沒用呢?5.其實你只要在新建查詢中輸入SELECT @@sql_mode;你會發現你在命令行中的設置並沒有生效6.所以,我們只能重新在這次連接(會話)的新建查詢中重新set sql_mode,之後這次連接(這次會話)不再需要7.這一段語言解釋了“在你查詢的語句之前set sql_mode”這句話

對辦法2辦法3兩種方法的說明

1.這兩種set sql_mode方法,都會隨著在我部署linux上的mysql重啟而恢復到我指定的配置文件的my.cnf裡面設置的sql-mode選項中的內容2.這句話比較繞3.意思就是:linux上的mysql重啟後,你在navicat上設置的就不再有效,而是依據你指定的配置文件中的設定,就是my.cnf這個文件中設定

附上其他mode解釋

1.STRICT_TRANS_TABLES:       在該模式下,如果一個值不能插入到一個事務表中,則中斷當前的操作,對非事務表不做限制2.3.NO_ZERO_IN_DATE:           在嚴格模式下,不允許日期和月份為零4.5.NO_ZERO_DATE:              設置該值,mysql資料庫不允許插入零日期,插入零日期會拋出錯誤而不是警告。6.7.ERROR_FOR_DIVISION_BY_ZERO:在INSERTUPDATE過程中,如果數據被零除,則產生錯誤而非警告。如 果未給出該模式,那麼數據被零除時MySQL返回NULL8.9.NO_AUTO_CREATE_USER:       禁止GRANT創建密碼為空的用戶10.11.NO_ENGINE_SUBSTITUTION:    如果需要的存儲引擎被禁用或未編譯,那麼拋出錯誤。不設置此值時,用預設的存儲引擎替代,並拋出一個異常12.13.PIPES_AS_CONCAT:           將"||"視為字元串的連接操作符而非或運算符,這和Oracle資料庫是一樣的,也和字元串的拼接函數Concat相類似14.15.ANSI_QUOTES:               啟用ANSI_QUOTES後,不能用雙引號來引用字元串,因為它被解釋為識別符16.17.NO_AUTO_VALUE_ON_ZERO:     該值影響自增長列的插入。預設設置下,插入0NULL代表生成下一個自增長值。如果用戶 希望插入的值為0,而該列又是自增長的,那麼這個選項就有用了。

對於其他mode說明

1.其他的mode使用也無外乎更改配置文件,或者獨立更改(也就是方法23

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 正常在Activity中使用Fragment的生命周期,第一次啟動過程是onAtach()-onCreate()-onCreateView()-onViewCreated()-onActivityCreated()-onStart()-onResume();隨著Activity被退棧銷毀,Fragm ...
  • 綁定服務 右邊部分就是綁定服務的運行過程 這樣綁定的目的就是服務綁定者調用服務的方法,在我的樣例里就是體現為服務訪問者調用服務的show()方法 來張效果圖吧 分析: 1、第一步還是繼承服務類 2、第二步的話就是配置服務 3、第三步就是綁定服務 ...
  • 播放音樂案例 分析: 和上一篇文章的結構是一樣的,只不過我們需要在這裡裡面加上播放音樂的一些操作: 其實也就是調用系統的播放音樂的API而已,寫在服務裡面就好, //媒體播放器 private MediaPlayer player; 第一步,照樣找個類來繼承服務類 第二步,該配置的監聽服務也是要配置 ...
  • service 下圖昨天是沒被綁定的情況,右邊是被綁定的情況 看下測試的效果圖: 程式被關閉,服務還是會在後臺運行,再次運行程式,程式還是能啟動和停止服務 分析: 1、先整個類繼承服務類 2、然後去配置這個服務 fry.myService是上面那個類的路徑 3、再去啟動和停止服務 ...
  • 這裡實現的功能是從主頁佈局的fragment點擊跳轉到一個acitivity,然後頂部是一個切換的segment底部部是一個listview,點擊segment分段讓listview載入不同的內容。我這裡沒再使用viewpager,應該使用viewpager+listview也能實現。我這裡使用的算 ...
  • 通過案例我們發現“獲得連接”和“釋放資源”兩次代碼將在之後的增刪改查所有功能中都存在,開發中遇到此種情況,將採用工具類的方法進行抽取,從而達到代碼的重覆利用。 1、使用properties配置文件 開發中獲得連接的4個參數(驅動、URL、用戶名、密碼)通常都存在配置文件中,方便後期維護,程式如果需要 ...
  • 存儲過程和函數: 1.創建存儲過程和函數: 存儲過程: delimiter $$ create procedure proc_name() BEGIN 查詢語句; // 記得加分號 END $$ delimiter ; 函數: delimiter $$ create function func_na ...
  • DML(data manipulation language): 它們是SELECT、UPDATE、INSERT、DELETE,就象它的名字一樣,這4條命令是用來對資料庫里的數據進行操作的語言DDL(data definition language): DDL比DML要多,主要的命令有CREATE、 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...