zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

SQL Error (1055) sql_mode=only_full_group_by详解编程语言

SQL编程语言 详解 Error by group Only mode
2023-06-13 09:11:48 时间
ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column aaa.test.age which is not functionally dependent on columns in GROUP BY clause;  

this is incompatible with sql_mode=only_full_group_by

SQL Error (1055) sql_mode=only_full_group_by详解编程语言

mysql5.1,不报异常

mysql5.5,不报异常

mysql5.6,不报异常

mysql5.7,报异常

原因是因为mysql中对 group by 用法的规定。严格意义上说,就是用了group by之后。select 的字段只能是group by的字段,或者需要加聚合函数的。在 oracle 中,一直有这项约定。所以直接就会报错。但是mysql 直到 5.7 版本之后才把这个要求明确限制起来。

这种问题两种思路:

第一修改sql,按照规定的规范重写项目中所有有问题的sql。很明显代价太大。风险很高;不过还未开发时可以严格规范写法。

第二种那就是把这种限制去掉,让功能继续像5.7之前的样子一样能跑。已经完成的项目用这种,因为第一种代价太大。

1、改写SQL语句,毕竟上面的写法不是标准的SQL语句

2、登陆mysql服务器,执行以下命令,在global与session级都修改


mysql 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; 

mysql 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;

3、结合第2种方法,在my.cnf文件中,指定sql_mode的值:


[mysqld] 

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与3结合可不用重启服务器,且即使重启配置也依然有效。

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/17770.html

cjavamysqloracle