美文网首页
关于mysql5.7.28版本遇到ONLY_FULL_GROUP

关于mysql5.7.28版本遇到ONLY_FULL_GROUP

作者: yunqing_71 | 来源:发表于2019-12-03 16:31 被阅读0次

    首先出现这个问题的情景:

    某年月日,领导给我一段数据库sql执行文件,让我放在本地开发调试,我本地用的mysql8.0,开发过程中遇到一个表的字段使用了mysql关键字function,查询的时候用到了mybatis的Example条件查询,首先不能改字段名、其次我在mapper.xml中的关键字改成function,还是不能解决,因为有一段Example的sql代码如下:

    <sql id="Example_Where_Clause" >
        <where >
          <foreach collection="oredCriteria" item="criteria" separator="or" >
            <if test="criteria.valid" >
              <trim prefix="(" suffix=")" prefixOverrides="and" >
                <foreach collection="criteria.criteria" item="criterion" >
                  <choose >
                    <when test="criterion.noValue" >
                      and ${criterion.condition}
                    </when>
                    <when test="criterion.singleValue" >
                      and ${criterion.condition} #{criterion.value}
                    </when>
                    <when test="criterion.betweenValue" >
                      and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
                    </when>
                    <when test="criterion.listValue" >
                      and ${criterion.condition}
                      <foreach collection="criterion.value" item="listItem" open="(" close=")" separator="," >
                        #{listItem}
                      </foreach>
                    </when>
                  </choose>
                </foreach>
              </trim>
            </if>
          </foreach>
        </where>
      </sql>
    

    查询的时候include refid了上面这段动态sql,所以万般求索不得解的情况下,又在本地安装了mysql5.7.28版本。

    安装过程省略。。。

    安装之后遇到错误如下

    Expression #1 of ORDER BY clause is not in GROUP BY clause and

    经查,原因如下:

    mysql 5.7.5版本开始,默认的sql_mode是有ONLY_FULL_GROUP_BY的,也就是说,你查询的字段必须都得存在于group by后面,否则就会报错。修改mysql的sql_mode就可以完美的解决这个问题。5.7版本看来还是太高了。。

    解决办法:

    1.打开命令行,进入数据库
     mysql -uroot -p
    
    2.查询数据库版本和sql_mode,可以看到是包含ONLY_FULL_GROUP_BY的。
    select version(),@@global.sql_mode;
    
    3.修改sql_mode去掉ONLY_FULL_GROUP_BY
    
    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问题解决。


    image.png

    4.领导要求保留mysql5.7的这个默认的强sql规则,所以恢复此模式的方法

    
    set global sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
    
    set session sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
    
    
    select @@sql_mode;
    

    5.遵守该特性的情况下怎么查询非group by 包裹和非聚合函数的字段?

    #答案就是用any_value()包裹此字段
    any_value(t1.name)
    

    相关文章

      网友评论

          本文标题:关于mysql5.7.28版本遇到ONLY_FULL_GROUP

          本文链接:https://www.haomeiwen.com/subject/zjacgctx.html