问题形容:在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关键字。具体可查看下图

参考:《2020最新Java根底精讲视频教程和学习路线!》
链接:https://www.cnblogs.com/haoyu...