问题描述: 在 MySQL 数据库下, 执行 SQL 插入语句报错. 错误信息如下:
错误原因: 在 MySQL5.7 之后, sql_mode 中默认存在 ONLY_FULL_GROUP_BY,SQL 语句未通过 ONLY_FULL_GROUP_BY 语义检查所以报错.
ONLY_FULL_GROUP_BY:ONLY_FULL_GROUP_BY 要求 select 语句中查询出来的列必须是明确的(其他语句也是一样).
以 SQL 语句 select columes from table group by list 为例: columns 必须是聚集函数或者在 group by 后的表达式 list 中, 并且 list 中必须包含主键, 否则也会报错.
insert,update,delete 语句都会报错(但不影响 SQL 语句的执行), 因为这三种语句执行之前也会执行查询操作.
以主键为 id 的表为例:
SELECT count(1) FROM customer GROUP BY `name`; 该 SQL 执行成功, 因为 count 是聚集函数;
SELECT * FROM customer GROUP BY `name`; 该 SQL 执行失败, 因为 * 中包含主键 id, 而 group by 后的表达式中并没有包含 id
SELECT name FROM customer GROUP BY `name`; 该 SQL 执行成功, 因为 name 包含在 group by 后的表达式中
SELECT name, contact FROM customer GROUP BY `name`; 该 SQL 执行失败, 因为 contact 没有包含在 group by 后的表达式中
解决方案:
一, 永久解决
1)在 MySQL 下执行 SELECT @@sql_mode 语句
2)将查询结果中的 ONLY_FULL_GROUP_BY 去掉然后复制, 打开 MySQL 的配置文件, 将 sql_mode 的值设置为复制的值
(若没有 sql_mode 在 [mysqld] 下方添加一行即可).
MySQL 配置文件所在位置: 安装版可通过 Windows 服务所对应 MySQL 启动项, 查看其对应属性 ->可执行文件路径, 获取 my.INI 路径.
免安装版一般在其根目录下.(默认是 my-default.INI, 必须将名字改为 my.INI 才能生效)
3)重新 MySQL 服务即可生效
二, 只在当前会话中解决, 重新进入 MySQL 后失效
1)在 MySQL 下执行 SELECT @@sql_mode 语句
2)将查询结果中的 ONLY_FULL_GROUP_BY 去掉然后复制, 然后执行 set sql_mode = '修改后的值'
三, 只在当前服务中解决, 重新 MySQL 服务后失效
1)解决方式同方法二, 只是在 select 和 set 时添加 global 关键字. 具体可查看下图
来源: http://www.bubuko.com/infodetail-3501611.html