错误代码:1055 与 sql_mode=only_full_group_by 不兼容

Posted

技术标签:

【中文标题】错误代码:1055 与 sql_mode=only_full_group_by 不兼容【英文标题】:Error Code: 1055 incompatible with sql_mode=only_full_group_by 【发布时间】:2016-07-12 10:45:22 【问题描述】:

我在切换到 Lahman SQL 棒球数据库的离线版本时遇到了问题。我正在使用嵌入到 EDX 课程中的终端。此命令在 Web 终端上运行良好:

SELECT concat(m.nameFirst,concat(" ",m.nameLast)) as Player,
    p.IPOuts/3 as IP,
    p.W,p.L,p.H,p.BB,p.ER,p.SV,p.SO as K,
    p.IPOuts+p.W*5+p.SV+p.SO-p.BB-p.L-p.H as PTS,
    p.yearID as Year
FROM Pitching p
Inner Join Master m
    ON p.playerID=m.playerID
WHERE p.yearID=2014 AND p.IPOuts>=50
GROUP BY m.playerID
ORDER BY PTS DESC;

运行 SQL 5.5.46,但是当我使用运行 5.7.10 的脱机版本时,我收到以下错误代码:

错误代码:1055。SELECT 列表的表达式 #1 不在 GROUP BY 中 子句并包含非聚合列“stats.m.nameFirst”,即 在功能上不依赖于 GROUP BY 子句中的列;这是 与 sql_mode=only_full_group_by 不兼容

我已经阅读了很多解决人们问题的方法,但在这种情况下它们没有帮助。这是以前从未发生过的,所以我认为这要么非常明显,要么我在编码方面做得很好。无论如何,有人知道如何解决这个问题吗?

【问题讨论】:

你不需要group by.删除它。 见***.com/documentation/mysql/8245/… 【参考方案1】:

在 5.7 中,sqlmode 默认设置为:

 ONLY_FULL_GROUP_BY,NO_AUTO_CREATE_USER,STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION

要删除子句 ONLY_FULL_GROUP_BY,您可以这样做:

SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

这假设您需要使用非聚合列创建 GROUP BY。

问候

【讨论】:

你是对的,这确实有效。但看起来我搞砸了,根本不需要 group by 子句。不过谢谢,如果我做得对,这对我有用。 这些从 5.5 到 5.6 的默认更改让很多人的生活变得艰难。他们不仅有动力,但通常不会被注意到。问候 注意:更改 sql_mode 不会影响存储过程。所以你需要再次drop并执行SP才能生效【参考方案2】:

上面接受的解决方案不适用于我在版本 5.7.9, for osx10.9 (x86_64) 上。

然后以下工作 -

set global sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

【讨论】:

上面接受的解决方案在 Ubuntu 16.04 上的 5.7.18 版本上对我不起作用,但它有效 是否有任何永久解决方案,解决此问题而不是每天运行此问题。茴香? @Kiran,是的。您必须将其添加到选项文件中 - dev.mysql.com/doc/refman/5.7/en/option-files.html 是的!此解决方案适用于 5.7.35-0ubuntu0.18.04.1 - (Ubuntu)。谢谢@Anis【参考方案3】:

对于其他用例:您不必禁用ONLY_FULL_GROUP_BY 鉴于这样的情况,根据 mysql 文档,“如果 name 不是 t 的主键或唯一的 NOT NULL 列,则此查询无效。在这种情况下,无法推断出任何功能依赖并发生错误:”

SELECT name, address, MAX(age) FROM t GROUP BY name;
ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP
BY clause and contains nonaggregated column 'mydb.t.address' which
is not functionally dependent on columns in GROUP BY clause; this
is incompatible with sql_mode=only_full_group_by

你可以使用这个ANY_VALUE('my_column_name') my_column_name 引用 mysql 文档,“在这种情况下,MySQL 忽略每个名称组中地址值的不确定性并接受查询。” 使用 ANY_VALUE() 来引用地址:

SELECT name, ANY_VALUE(address), MAX(age) FROM t GROUP BY name;

【讨论】:

谢谢!!!在这个网站上可以多次找到相同的 GROUP BY 类型的问题,但从未提到过 ANY_VALUE 选项……太好了,再次感谢!【参考方案4】:

如果你按照选择的答案做,@sql_mode 可能是这样的——

',STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'.

“STRICT_TRANS_TABLES”字符串前面有一个逗号。

执行这个——

set @@sql_mode = 
'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

它有效。

另外,你可以尝试跟随exp,

SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY,','');

我没有测试它,但我想它可能有效。

【讨论】:

【参考方案5】:
SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

** your query **

这将解决您的问题。

【讨论】:

【参考方案6】:

可以在mysql中设置变量:

mysql> set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
mysql> set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

记住 NO_AUTO_CREATE_USER 不适用于 mysql 8。

如果这不起作用,请执行以下操作:

mysql > set sql_mode = ''

【讨论】:

【参考方案7】:

我认为在最近的版本中更改 *.cnf 文件是不可能的。 相反,您可以更改 mysql.service 文件

/lib/systemd/system/mysql.service
ExecStart=/usr/sbin/mysqld --sql-mode=STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION

在最近的版本中效果很好,但不是最好的方法 您可以使用以下方法

   SELECT name, max(address), MAX(age) FROM t GROUP BY name;

【讨论】:

【参考方案8】:

使用 mysql 版本 8.0.26。我尝试了很多解决方案,但没有任何效果。我更改了 Full groupBy 模式更改 Engine_subsitution。最后,我尝试了这个

mysql -u root -p -e "SET GLOBAL sql_mode = 'NO_ENGINE_SUBSTITUTION';"

这对我有用

【讨论】:

以上是关于错误代码:1055 与 sql_mode=only_full_group_by 不兼容的主要内容,如果未能解决你的问题,请参考以下文章

MySQL错误1055

MySQL错误1055

sql查询出现1055 this is incompatible with sql_mode=only_full_group_by

解决1055 - Expression #1......this is incompatible with sql_mode=only_full_group_by

#1055 - SELECT 列表的表达式不在 GROUP BY 子句中,并且包含非聚合列,这与 sql_mode=only_full_group_by 不兼容

与 sql_mode=only_full_group_by 不兼容的 MySQL 查询