错误代码:1055 与 sql_mode=only_full_group_by 不兼容
Error Code: 1055 incompatible with sql_mode=only_full_group_by
我在切换到 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时,我得到以下错误代码:
Error Code: 1055. Expression #1 of SELECT list is not in GROUP BY
clause and contains nonaggregated column 'stats.m.nameFirst' which is
not functionally dependent on columns in GROUP BY clause; this is
incompatible with sql_mode=only_full_group_by
我已经阅读了很多解决人们问题的方法,但在这种情况下它们没有帮助。这以前从未发生过,所以我认为这要么是非常明显的,要么是我在编码方面做得很好。无论如何,有人知道如何解决这个问题吗?
在 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。
此致
上面接受的解决方案在版本 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';
对于其他用例:您不一定要禁用 ONLY_FULL_GROUP_BY
鉴于这种情况,根据 mysql 文档,"This query is invalid if name is not a primary key of t or a unique NOT NULL column. In this case, no functional dependency can be inferred and an error occurs:"
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 文档,"In this case, MySQL ignores the nondeterminism of address values within each name group and accepts the query."
使用ANY_VALUE() 来引用地址:
SELECT name, ANY_VALUE(address), MAX(age) FROM t GROUP BY name;
如果按照选择的答案去做,@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,','');
我没有测试它,但我想它可能有效。
SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
** your query **
这将解决您的问题。
您可以在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 = ''
我认为*.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;
使用 mysql 版本 8.0.26。我尝试了很多解决方案,但没有任何效果。我更改了 Full groupBy 模式更改 Engine_subsitution。最后,我尝试了这个
mysql -u root -p -e "SET GLOBAL sql_mode = 'NO_ENGINE_SUBSTITUTION';"
这对我有用
我在切换到 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时,我得到以下错误代码:
Error Code: 1055. Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'stats.m.nameFirst' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
我已经阅读了很多解决人们问题的方法,但在这种情况下它们没有帮助。这以前从未发生过,所以我认为这要么是非常明显的,要么是我在编码方面做得很好。无论如何,有人知道如何解决这个问题吗?
在 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。
此致
上面接受的解决方案在版本 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';
对于其他用例:您不一定要禁用 ONLY_FULL_GROUP_BY
鉴于这种情况,根据 mysql 文档,"This query is invalid if name is not a primary key of t or a unique NOT NULL column. In this case, no functional dependency can be inferred and an error occurs:"
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 文档,"In this case, MySQL ignores the nondeterminism of address values within each name group and accepts the query."
使用ANY_VALUE() 来引用地址:
SELECT name, ANY_VALUE(address), MAX(age) FROM t GROUP BY name;
如果按照选择的答案去做,@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,','');
我没有测试它,但我想它可能有效。
SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
** your query **
这将解决您的问题。
您可以在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 = ''
我认为*.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;
使用 mysql 版本 8.0.26。我尝试了很多解决方案,但没有任何效果。我更改了 Full groupBy 模式更改 Engine_subsitution。最后,我尝试了这个
mysql -u root -p -e "SET GLOBAL sql_mode = 'NO_ENGINE_SUBSTITUTION';"
这对我有用