MySQL 8在选择的不同查询中未检测到功能依赖性

时间:2018-09-09 07:56:02

标签: mysql select distinct functional-dependencies

我使用以下查询创建表:

create table a (
  `id` int not null auto_increment,
  b varchar(10),
  primary key (`id`)
);

执行

select distinct `id` from a order by `b`;

导致此错误:

  

错误3065(HY000):ORDER BY子句的表达式#1不在SELECT列表中,引用的列'portal.a.b'不在SELECT列表中;这与DISTINCT不兼容

但是如果我将查询更改为

select `id` from a group by `id` order by `b`;

在逻辑上等效,成功。

我正在使用official Docker image for MySQLmysql --version显示器

  

x86_64上适用于Linux的mysql Ver 8.0.12(MySQL社区服务器-GPL)

似乎MySQL仍无法在选择的不同查询中检测到功能依赖性。我对吗? MySQL的开发人员会解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

这来自MySQL 5.7中引入的新SQL模式: ONLY_FULL_GROUP_BY

此模式的目标是使MySQL成为GROUP BY查询的SQL标准。

此模式已在您的数据库上激活。您可以禁用它,也可以使查询适应标准,这可能是最好的选择。

这将引发您的错误:

SET sql_mode = 'ONLY_FULL_GROUP_BY';

drop table a;
create table a (
  `id` int not null auto_increment,
  b varchar(10),
  primary key (`id`)
);
INSERT INTO a VALUES (NULL, 'aaaa');
INSERT INTO a VALUES (NULL, 'bbbb');

select distinct `id` from a order by `b`;

如果删除ONLY_FULL_GROUP_BY模式,则会得到结果:

SET sql_mode = '';

drop table a;
create table a (
  `id` int not null auto_increment,
  b varchar(10),
  primary key (`id`)
);
INSERT INTO a VALUES (NULL, 'aaaa');
INSERT INTO a VALUES (NULL, 'bbbb');

select distinct `id` from a order by `b`;

您可以在Rextester上看到它