当前位置:   article > 正文

mysql中ONLY_FULL_GROUP_BY报错

mysql中ONLY_FULL_GROUP_BY报错
  • SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,‘ONLY_FULL_GROUP_BY’,‘’));
  • SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,‘ONLY_FULL_GROUP_BY’,‘’));

– 禁用会话级别的 ONLY_FULL_GROUP_BY SET SESSION sql_mode = ‘’;

– 或者禁用全局级别的 ONLY_FULL_GROUP_BY SET GLOBAL sql_mode = ‘’;

在 MySQL 中,sql_mode 是一个服务器变量,用于定义 SQL 语句的运行模式。ONLY_FULL_GROUP_BYsql_mode 中的一个选项,它影响 SQL 查询中 GROUP BY 子句的行为。

原因

sql_mode 包含 ONLY_FULL_GROUP_BY 时,MySQL 强制要求:

  • SELECT 语句中使用 GROUP BY 子句时,所有非聚合的 SELECT 列表中的列必须在 GROUP BY 子句中明确指定。
  • 也就是说,不能选择任何没有在 GROUP BY 子句中出现的列。

这种模式的主要目的是避免因不明确的聚合而产生的歧义或错误。

解决办法

如果你发现你的 SQL 查询因为 ONLY_FULL_GROUP_BY 而失败,你可以采取以下方法解决:

  1. 修改 SELECT 语句

    • 确保所有非聚合的 SELECT 列表中的列都在 GROUP BY 子句中明确指定。
  2. 禁用 ONLY_FULL_GROUP_BY

    • 可以通过以下 SQL 命令禁用 ONLY_FULL_GROUP_BY
禁用会话级别的 ONLY_FULL_GROUP_BY
SET SESSION sql_mode = '';
  • 1

这条命令会将当前会话的 sql_mode 设置为空,从而禁用 ONLY_FULL_GROUP_BY

禁用全局级别的 ONLY_FULL_GROUP_BY
SET GLOBAL sql_mode = '';
  • 1

这条命令会将全局的 sql_mode 设置为空,从而禁用 ONLY_FULL_GROUP_BY。注意,这种更改是永久性的,直到下一次更改。

详细解释

  • SET SESSION:这个命令只影响当前会话。如果你关闭并重新打开连接,更改将不再有效。
  • SET GLOBAL:这个命令影响所有新的和现有的连接。更改是永久性的,直到下一次更改。

示例

假设你有以下 SQL 查询:

SELECT department, COUNT(*)
FROM employees
GROUP BY department;
  • 1
  • 2
  • 3

如果 sql_mode 包含 ONLY_FULL_GROUP_BY,这条查询是有效的,因为 department 列在 GROUP BY 子句中。

但是,如果你尝试执行以下查询:

SELECT department, COUNT(*), manager
FROM employees
GROUP BY department;
  • 1
  • 2
  • 3

这条查询将失败,因为 manager 列没有在 GROUP BY 子句中。

为了使这条查询有效,你可以:

  • manager 列添加到 GROUP BY 子句中。
  • 或者禁用 ONLY_FULL_GROUP_BY

通过禁用 ONLY_FULL_GROUP_BY,你可以避免这些限制,但请确保这样做不会导致数据的歧义或错误。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/871364
推荐阅读
相关标签
  

闽ICP备14008679号