MySQL:SQL错误:1140,SQLState:42000

时间:2013-10-10 13:11:25

标签: java mysql jpa

我的项目中配置了两个数据库,一个在我的本地计算机上运行,​​另一个在远程服务器上运行。访问远程数据库服务器时没有任何问题,但访问本地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是正确的。

2 个答案:

答案 0 :(得分: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 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
  6. 更新

    这是您的评论的答案。

    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"或{{1}等选项文件中使用my.cnf (Unix operating systems) }。 modes是由逗号分隔的不同模式的列表。要显式清除SQL模式,请在命令行上使用my.ini (Windows)将其设置为空字符串,或在选项文件中使用--sql-mode=""

    • 要在运行时更改SQL模式,请使用

      sql-mode=""
      用于设置sql_mode系统变量的语句。设置 GLOBAL变量需要SUPER权限并影响从那时起连接的所有客户端的操作。设置SESSION变量仅影响当前客户端。任何客户端都可以随时更改自己的会话sql_mode值。

    • 要确定当前的全局或会话sql_mode值,请使用以下语句:

      SET [GLOBAL|SESSION] sql_mode='modes'
       SELECT @@GLOBAL.sql_mode;

    • 您可以参考sql_mode table


    SELECT @@SESSION.sql_mode;

    这是因为MySQL版本。什么是本地计算机的MySQL版本?

    如何查看MySQL版本?

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

    为了测试sql_mode mysql> SELECT version(); +-----------+ | version() | +-----------+ | 5.5.28 | +-----------+ 1 row in set (0.00 sec) ,我创建了表ONLY_FULL_GROUP_BY,其中包含两列patient和插入的记录。请记住,sql_mode id, name不是默认设置,您需要设置。

    1)MySQL版本 5.0.45-community-nt

    ONLY_FULL_GROUP_BY

    失败了,将sql_mode设置为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 是没有意义的,因为它不允许在GROUP BY子句中未命名的非聚合列。

    2)MySQL版 5.1.40-community

    ONLY_FULL_GROUP_BY

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

    ONLY_FULL_GROUP_BY

    3)MySQL版本 5.5.28

    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  
    

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

    ONLY_FULL_GROUP_BY

    结论

    正如您所看到的,在5.0.45版本上查询失败,并且在5.1.40和5.5.28之后/之后成功 在没有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 的MySQL版本5.1.10(not sure)查询失败之前,无论是否设置了sql_mode GROUP BY

    一些有趣的错误和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

答案 1 :(得分:0)

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

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