2013-10-10 144 views
2

在我的項目中配置了兩個數據庫,一個在本地計算機上運行,​​另一個在遠程服務器上運行。我在訪問遠程數據庫服務器時沒有任何問題,但在訪問本地MySQL數據庫時出現以下錯誤。MySQL:SQL錯誤:1140,SQLState:42000

WARN [org.hibernate.util.JDBCExceptionReporter] SQL Error: 1140, SQLState: 42000 
ERROR [org.hibernate.util.JDBCExceptionReporter] Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause 

我看到了MySQL文檔,但無法完全理解根本原因。 我認爲,因爲我可以從遠程數據庫獲取相同的數據,然後java code and query是正確的。

+1

似乎是一個語法問題。你的SQL查詢是什麼樣的? – orique

+0

查詢是使用JPA Criteria實現的,並且它與具有與本地機器相同數據源的遠程數據庫服務器正常工作 – user1010399

+0

我假設遠程數據庫也是MySQL。數據庫之間有任何顯着差異主要版本或左右... – orique

回答

2

以下查詢在啓用ONLY_FULL_GROUP_BY時無效。首先是無效的,因爲在選擇列表名稱不是GROUP BY條款

mysql> SELECT name, MAX(age) FROM t; 
ERROR 1140 (42000): Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) 

沒有GROUP列是違法的命名,如果沒有GROUP BY子句

您可以重新編寫查詢做工精細的

mysql> SELECT name, MAX(age) FROM t GROUP BY name; 

關閉ONLY_FULL_GROUP_BY和電子恐怖應該消失。

鏈接可以幫助你

  1. 您可以搜索MySQL的錯誤here
  2. group-by-functions
  3. similar post on stackoverflow.com
  4. another forum where similar problem discussed
  5. server-sql-mode

UPDATE

這是對您的評論的回答。

But i would like to know more about disabling the Group BY mode in mysql db. 

Server SQL Modes

  • MySQL服務器可以在不同的SQL模式下運行,並能運用不同的模式,爲不同的客戶,這取決於sql_mode系統變量的值。此功能使每個應用程序都可以根據自己的需求量身定製服務器的操作模式。

  • 要設置在服務器啓動時的SQL模式,使用命令行上--sql-mode="modes"選項或sql-mode="modes"在選項文件如my.cnf (Unix operating systems)my.ini (Windows)。模式是用逗號分隔的不同模式的列表。要明確清除SQL模式,請在命令行上使用--sql-mode=""或在選項文件中使用sql-mode=""將其設置爲空字符串。

  • 要在運行時更改SQL模式,使用

    SET [GLOBAL|SESSION] sql_mode='modes'
    語句設置的sql_mode系統變量。設置GLOBAL變量需要SUPER特權,並影響從此時開始連接的所有客戶端的操作。設置SESSION變量僅影響當前客戶端。任何客戶端可以隨時更改自己的會話sql_mode值。

  • 要確定當前的全球或會話的sql_mode值,可以使用下面的語句:

    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;

  • 你可以參考sql_mode table


I followed the manuals, Added the ONLY_FULL_GROUP_BY in sql-mode 
but no difference. 

這是因爲MySQL版本。什麼是您的本地計算機的MySQL版本?

如何檢查MySQL版本?

mysql> SELECT version(); 
+-----------+ 
| version() | 
+-----------+ 
| 5.5.28 | 
+-----------+ 
1 row in set (0.00 sec)  

出於測試的sql_mode ONLY_FULL_GROUP_BY,我創建的表patient有兩列id, name和插入的記錄。記住sql_mode ONLY_FULL_GROUP_BY不是默認設置,你需要設置,如果你想。

1)MySQL版本5.0.45 社區-NT

SELECT name, MAX(id) FROM patient; 
ERROR 1140 (42000): Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause 

它失敗了,就在的sql_mode設置爲ONLY_FULL_GROUP_BY,因爲它不會允許未在名爲非聚合列沒有點GROUP BY子句。

2)MySQL版本5.1.40社區

mysql> SELECT name, MAX(id) from patient; 
+----------+--------+ 
| MAX(id) | name | 
+----------+--------+ 
|  33 | aniket | 
+----------+--------+ 
1 row in set (0.03 sec) 

然後設置的sql_mode ONLY_FULL_GROUP_BY

mysql> set sql_mode = 'ONLY_FULL_GROUP_BY'; 
Query OK, 0 rows affected (0.00 sec) 

mysql> SELECT name, MAX(id) from patient; 
ERROR 1140 (42000): Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause 

3後),MySQL版本5.5。28

mysql> SELECT name, MAX(id) from patient; 
+----------+--------+ 
| MAX(id) | name | 
+----------+--------+ 
|  33 | aniket | 
+----------+--------+ 
1 row in set (0.03 sec) 

然後設置的sql_mode後ONLY_FULL_GROUP_BY

mysql> set sql_mode = 'ONLY_FULL_GROUP_BY'; 
Query OK, 0 rows affected (0.00 sec) 

mysql> SELECT name, MAX(id) from patient; 
ERROR 1140 (42000): Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause 

結論

正如你可以看到查詢失敗的5.0.45版本,和/後5.1.40和5.5上成功.28 在沒有GROUP BY的MySQL版本5.1.10(not sure)之前查詢失敗,不管sql_mode ONLY_FULL_GROUP_BY是否設置。

一些有趣的錯誤和常見問題的sql_mode鏈接

  1. ONLY_FULL_GROUP_BY sql mode is overly restrictive
  2. sql-mode: only full group by mode not working
  3. MySQL 5.0 FAQ: Server SQL Mode
+0

謝謝Aniket,它的工作原理。但我想知道更多關於在MySQL數據庫中禁用「Group BY」模式的信息。我遵循手冊,在'sql-mode'中添加'ONLY_FULL_GROUP_BY',但沒有區別。 – user1010399

+0

你的MySQL版本是什麼? –

+0

MySQL版本:5.0.27(本地機器):出現問題。 MySql版本:5.5.15(遠程服務器):完全沒有問題。 非常感謝你。現在我明白了爲什麼我的本地Mysql服務器出現問題。 – user1010399

0

你需要包括一個GROUP BY子句(你沒有發佈你的查詢,但我猜你錯過了一個基於錯誤)。這只是本地主機上的問題,而不是遠程的原因是遠程服務器可能關閉了ONLY_FULL_GROUP_BY,但您的本地數據庫已啓用它。

理想情況下,您應該指定一個GROUP BY子句,但您也可以切換本地數據庫的ONLY_FULL_GROUP_BY設置。

相關問題