已关闭ONLY_FULL_GROUP_BY模式,GROUP BY子句仍报MySQL模式错误求助
为什么修改全局sql_mode后仍触发ONLY_FULL_GROUP_BY错误?
嘿,这问题我碰到过好多次,其实核心原因是全局设置和当前会话设置不匹配,下面给你拆解清楚:
常见原因
- 全局sql_mode的修改不会立刻作用于当前连接:你执行的
SET @@global.sql_mode := replace(@@global.sql_mode, 'ONLY_FULL_GROUP_BY', '');是修改了全局级别的配置,但这个改动只对之后新建的数据库连接生效,当前你正在用的连接还是沿用之前的会话级sql_mode,所以查询依然会触发ONLY_FULL_GROUP_BY的检查。 - 会话级sql_mode未同步更新:即使你改了全局配置,当前会话的sql_mode可能还保留着ONLY_FULL_GROUP_BY,你可以先执行
SELECT @@sql_mode;查看当前会话的模式,大概率还能看到这个值。
快速解决方案
这里给你几个立竿见影的处理方式:
- 修改当前会话的sql_mode:执行下面的语句,立刻让当前连接生效:
之后再跑你的查询就不会报错了。SET @@sql_mode := replace(@@sql_mode, 'ONLY_FULL_GROUP_BY', ''); - 重启数据库连接:关闭当前的数据库客户端连接,重新打开一个新连接,这时候全局的sql_mode设置会自动应用到新会话中。
- 永久生效配置(推荐):如果不想每次重启连接都要改,就修改MySQL的配置文件(Linux下是
/etc/my.cnf或/etc/mysql/my.cnf,Windows下是my.ini),在[mysqld]节点下添加或修改:
保存后重启MySQL服务,这样所有新连接都会默认使用去掉ONLY_FULL_GROUP_BY的模式。sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
额外建议
其实从SQL规范的角度来说,你的查询逻辑是有瑕疵的:SELECT里的m.dept_no既不在GROUP BY里,也没有用聚合函数(比如MAX()/MIN())。虽然关闭ONLY_FULL_GROUP_BY能让查询跑通,但最好还是规范你的SQL,比如把m.dept_no加入GROUP BY子句:
SELECT m.dept_no, m.emp_no, d.dept_name FROM dept_manager_dup m LEFT JOIN department_dup d ON m.dept_no = d.dept_no GROUP BY m.emp_no, m.dept_no ORDER BY m.dept_no;
这样不管sql_mode怎么设置,查询都能正常运行,也更符合SQL的设计逻辑。
内容的提问来源于stack exchange,提问作者Saurabh Sharma
相关产品推荐
相关产品推荐

