【问题标题】:MySQL : SQL Error: 1140, SQLState: 42000MySQL:SQL 错误:1140,SQLState:42000
【发布时间】:2013-10-10 13:11:25
【问题描述】:

我的项目中配置了两个数据库,一个在我的本地机器上运行,另一个在远程服务器上运行。我访问远程数据库服务器没有任何问题,但在访问本地 MySQL 数据库时出现以下错误。

 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 是正确的。

【问题讨论】:

  • 似乎是语法问题。您的 SQL 查询是什么样的?
  • 查询是使用 JPA Criteria 实现的,并且它与与我的本地计算机具有相同数据源的远程数据库服务器工作正常
  • 我假设远程数据库也是 MySQL。数据库之间有什么显着差异吗?主要版本左右...
  • 是的,远程数据库也是 MySql,唯一的区别是我注意到我的本地 mysql 数据库中有过程文件

标签: java mysql jpa


【解决方案1】:

以下查询在启用ONLY_FULL_GROUP_BY 时无效。第一个无效,因为选择列表中的名称未在GROUP BY 子句中命名

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

如果没有 GROUP BY 子句,则没有 GROUP 列是非法的

您可以重写查询以正常工作

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

更新

这是对您评论的回答。

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,我创建了带有两列 id, name 的表 patient 并插入了记录。请记住 sql_mode ONLY_FULL_GROUP_BY 不是默认设置,如果需要,您需要设置。

1)MySQL版本5.0.45-community-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-community

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 上/之后成功 在 MySQL 版本之前,5.1.10(not sure) 没有 GROUP BY 的查询无论是否设置了 sql_mode ONLY_FULL_GROUP_BY 都会失败。

一些有趣的bug和sql_mode faq链接

  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

【讨论】:

  • 感谢 Aniket,它有效。但我想了解更多关于在 mysql db 中禁用 Group BY 模式的信息。我按照手册,在sql-mode 中添加了ONLY_FULL_GROUP_BY,但没有区别。
  • 你的 MySQL 版本是多少?
  • MySQL 版本:5.0.27(本地机器):出现问题。 MySql 版本:5.5.15(远程服务器):完全没有问题。非常感谢你。现在我明白为什么我在本地 Mysql 服务器上遇到问题了。
  • 不客气。类似问题请见this question
【解决方案2】:

您需要包含一个GROUP BY 子句(您没有发布您的查询,但我猜您根据错误错过了一个)。这只是您的本地主机上的问题,而不是远程服务器上的问题的原因是远程服务器可能关闭了ONLY_FULL_GROUP_BY,但您的本地数据库已打开。

理想情况下,您应该指定 GROUP BY 子句,但您也可以只切换本地数据库的 ONLY_FULL_GROUP_BY 设置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-15
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    相关资源
    最近更新 更多