division by zero_MySql报错only_full_group_by的解决办法
时间: 2023-09-22 18:05:03 浏览: 96
这个错误是由于MySQL的版本更新所导致的,MySQL默认情况下在使用GROUP BY聚合函数时会进行严格模式的检查,只允许SELECT语句中的列出现在GROUP BY子句中或者使用聚合函数进行计算。
解决这个问题可以在MySQL的配置文件中或者在查询时设置SQL_MODE为非严格模式,具体方法如下:
1. 修改MySQL的配置文件my.cnf,在[mysqld]下添加以下内容:
```
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
```
2. 在查询时设置SQL_MODE,如下所示:
```
SET SQL_MODE='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
```
以上两种方法都可以解决这个问题,建议使用第一种方法对MySQL进行全局的设置。
相关问题
sql_mode设置是STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION ,为什么还是报错could not extract ResultSet] with root cause com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: In aggregated query without GROUP BY, expression #1 of SELECT list contains nonaggregated column 'wemall_test.c.id'; this is incompatible with sql_mode=only_full_group_by
根据你提供的 sql_mode 设置:STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,错误消息表明你的查询中存在问题。
错误消息指出,在没有使用 GROUP BY 的聚合查询中,SELECT 列表中的表达式 #1 包含了非聚合的列 'wemall_test.c.id',而这与 sql_mode=only_full_group_by 不兼容。这意味着你的查询中包含了聚合函数(如 COUNT、SUM 等),但没有明确指定 GROUP BY 子句,并且 SELECT 列表中包含了非聚合的列。
要解决这个问题,你可以尝试以下几种方法:
1. 添加 GROUP BY 子句:根据你的查询需求,将 GROUP BY 子句添加到查询中,以明确指定按照哪些列进行分组。
2. 修改 SELECT 列表:如果你不需要在查询结果中显示非聚合的列,可以修改 SELECT 列表,只保留聚合函数和必要的列。
3. 修改 sql_mode 设置:如果你希望允许在没有 GROUP BY 的聚合查询中使用非聚合列,可以修改 sql_mode 设置。例如,移除 only_full_group_by 参数。但请注意,这可能会影响到其他查询的行为,所以需要谨慎考虑。
请根据你的具体需求选择适合的解决方案,并确保你的查询语句符合数据库的语法规则和约束条件。
sql-mode="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
sql-mode是MySQL中的一个系统变量,用于设置SQL执行的模式。在这个设置中,包括了以下几个模式:
- ONLY_FULL_GROUP_BY:当使用GROUP BY语句时,要求SELECT查询的列必须是GROUP BY子句中的列或者是聚合函数。
- STRICT_TRANS_TABLES:启用严格的事务表模式,在插入或更新数据时,如果数据类型不匹配或者值不符合约束条件,将会报错。
- NO_ZERO_IN_DATE:禁止在日期和时间中使用'0000-00-00'或者'0000-00-00 00:00:00',这样的值将会被视为无效。
- NO_ZERO_DATE:禁止在日期和时间中使用'0000-00-00',这样的值将会被视为无效。
- ERROR_FOR_DIVISION_BY_ZERO:当除数为零时,执行除法运算将会报错。
- NO_ENGINE_SUBSTITUTION:如果存储引擎不可用,将不会替代使用其他存储引擎。
阅读全文