• mysql严格模式导致sql查询失败,references column '***' which is not in SELECT list


    一、背景

    在最近的一次版本发布之后,在后台日志中发现了如下错误信息:

    从日志里我们可以看出来,提示sql语句里的ORDER BY与DISTINCT不兼容;

    检查后发现sql语句中有类似如下格式的语句,确实我们在使用order by的同时又使用了distinct

    SELECT distinct req.requirement_no, req.requirement_name
    FROM leanmanage_requirement req
    ORDER BY req.created_time DESC;
    

    执行之后出现了如下的错误信息:

    二、原因分析

    查阅之后发现,在mysql5.7版本之后默认开启了严格模式,而对于上面这条sql,是因为默认启用了ONLY_FULL_GROUP_BY SQL模式。

    1.在该模式下,我们使用GROUP BY查询时,出现在SELECT字段后面的只能是GROUP BY后面的分组字段,或使用聚合函数包裹着的字段,否则会报错如下信息:

    Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'database.table.column' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

    2.当使用ORDER BY查询时,不能使用SELECT DISTINCT去重查询。否则会报错如下信息:

    Expression #1 of ORDER BY clause is not in SELECT list, references column 'database.table.column' which is not in SELECT list; this is incompatible with DISTINCT
    

    三、解决方案

    既然知道了问题产生的原因,我们可以通过以下两种方法进行修改。

    1.修改sql语句,使其符合规范

    2.关闭ONLY_FULL_GROUP_BY SQL模式

    四、测试实践

    1.使用命令关闭ONLY_FULL_GROUP_BY SQL模式(暂时的,重启mysql之后即会失效)

    # 查看mysql版本
    select VERSION();
    # 查看全局设置 sql_mode
    select @@sql_mode;
    SHOW GLOBAL VARIABLES where Variable_name = 'sql_mode';
    # 使用命令关闭ONLY_FULL_GROUP_BY SQL模式(暂时的,重启mysql之后即会失效)
    set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
    

    2.修改mysql配置文件,并重启mysql(永久修改)

    vim /etc/my.cnf
    service mysqld restart

    再次执行sql,发现语句成功执行。

  • 相关阅读:
    ansible管理windows实践
    SQL server 备份/恢复/压缩 进度查询
    什么是容器
    pycharm 快捷键
    SUSE Linux--zypper程序包管理(实战命令总结)
    源码编译安装
    CentOS-yum基本使用
    rpm管理
    btrfs的精简总结版
    btrfs的介绍与使用
  • 原文地址:https://www.cnblogs.com/sueyyyy/p/14445569.html
Copyright © 2020-2023  润新知