📌  相关文章
📜  不兼容的 sql_mode=only_full_group_by - SQL (1)

📅  最后修改于: 2023-12-03 14:48:49.727000             🧑  作者: Mango

不兼容的 sql_mode=only_full_group_by - SQL

在MySQL 5.7及以上版本中,引入了一个sql_mode的新模式only_full_group_by,它增强了GROUP BY语句的严格性,要求查询中的每个非聚集列必须完全由GROUP BY子句确定。如果SELECT列表或HAVING子句包含非聚集列,则必须在GROUP BY子句中明确地包含这些列。否则,MySQL将拒绝执行查询,抛出一个 "不兼容的 sql_mode=only_full_group_by" 的错误。

为什么出现这个错误?

该错误是由于在MySQL 5.7及以上的版本中,GROUP BY默认采用only_full_group_by模式,这会强制要求在SELECT中使用的非聚合列也必须在GROUP BY字句中出现。如果SELECT中的非聚合列未出现在GROUP BY中,MySQL将无法确定唯一的结果,并因此拒绝查询请求。

以下是示例:

SELECT column1, column2, COUNT(column3) FROM table1 GROUP BY column1

在MySQL 5.7之前的版本中,以上语句将执行成功,因为MySQL会自动忽略列column2,而对于列column3,则会自动计算其聚合结果。然而,在MySQL 5.7及以上版本中,默认启用了 only_full_group_by 模式,因此查询将抛出“不兼容的sql_mode = only_full_group_by”的错误。

如何解决此错误?

存在多种解决方法,以下是其中一些:

方法一:在GROUP BY语句中提供所有非聚合列

一种解决方法是在GROUP BY子句中列出所有SELECT列表中的非聚合列。这可以确保MySQL能够获得唯一的结果,并且不会因为未包含所有非聚合列而拒绝查询。

例如:

SELECT column1, column2, COUNT(column3)
FROM table1
GROUP BY column1, column2
方法二:使用聚合函数覆盖非聚合列

另一种解决方法是使用聚合函数覆盖所有非聚合列,以确保SELECT语句中的每个列都是聚合列。这样,MySQL将不需要在GROUP BY子句中包含非聚合列。

例如:

SELECT column1, MAX(column2), COUNT(column3)
FROM table1
GROUP BY column1
方法三:更改 sql_mode 模式

如果您不想使用 only_full_group_by 模式,还可以将其从sql_mode中删除。

例如:

SET sql_mode = "STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION";

此命令将sql_mode模式更改为“STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION”,从而关闭 only_full_group_by 模式。

结论

'不兼容的 sql_mode=only_full_group_by' 错误是由MySQL从5.7及以上版本引入的严格GROUP BY模式导致的。为了避免错误,请确保您的查询中每个非聚合列都出现在GROUP BY子句中,或使用聚合函数使每个列都成为聚合列,或删除 only_full_group_by 模式。