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

时间:2016-03-24 18:03:53

标签: mysql sql mysql-workbench mysql-error-1055

我一直在切换到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

不兼容

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

7 个答案:

答案 0 :(得分:40)

在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。

此致

答案 1 :(得分:22)

上面接受的解决方案对版本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';

答案 2 :(得分:5)

对于其他用例:您不一定要禁用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;

答案 3 :(得分:1)

innodb_buffer_pool_size

这将解决您的问题。

答案 4 :(得分:0)

如果您按照选择的答案进行操作,则@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 :(得分:0)

您可以在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 = ''

答案 6 :(得分:0)

我认为在最新版本中不可能更改 *.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;
相关问题