执行sql查询时,服务器上报错。
错误原因:在MySQL5.7之后,sql_mode中默认存在ONLY_FULL_GROUP_BY,SQL语句未通过ONLY_FULL_GROUP_BY语义检查所以报错。
我的查询语句要实现的功能是要筛选出所有单据中最后一次更新的数据,根据单据编码group by,再通过编码和更新时间来order by,本地就没问题,服务器上直接报错。
原因是:
执行此条语句:select @@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
发现这些都是数据库本身的验证功能。
而ONLY_FULL_GROUP_BY规定:出现在select中的所有字段都要出现在group by后面。
修改方式:
1.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 ';
2.因为服务器一般限制都会比较严格,如果dba不同意修改此处的全局配置的话,就只能在程序中修改为会话级别的配置了。
set SESSION sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION ';
然后再执行查询语句。