MySQL运行模式

模式说明

在MYSQL5.7前SQL运行在宽松模式,会以开放不严谨的方式运行。在5.7后默认运行模式较为严格,这会造成在升级数据库时,数据库的操作出现问题。
使用命令select @@sql_mode查看当前所有的运行模式,注意此时为多种模式的组合,如:

 ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
选项 说明
ONLY_FULL_GROUP_BY 结果中的字段需要在 GROUP BY 中出现
STRICT_TRANS_TABLES 如果一个值不能插入到一个事务表中,则中断当前的操作
NO_ZERO_IN_DATE 不能插入为0的日期和月份
NO_ZERO_DATE 不能添加 0000-00-00 格式的日期
ERROR_FOR_DIVISION_BY_ZERO 除数不能为零,禁止该模式后插入的结果为NULL

常用模式

将常用的模式进行组合设置:

模式 说明
ANSI 宽松模式:对长度超过字段定义等错误进行截取等操作。报WARNING警告错误
TRADITIONAL 严格模式:对数据进行严格校验。事务处理中会进行事务回滚操作。非事务时,发生错误时就立即报错终止,会造成有部分数据插入

设置宽松模式或严格模式:

set session sql_mode = ANSI;
或
set sql_mode = ANSI;

ONLY_FULL_GROUP_BY

设置该模式时,select 字段不允许出现group by不包含的字段,如:

SELECT name, age from person where group by age;

上述语句中,name不是group by中的字段,ONLY_FULL_GROUP_BY模式下该语句会报错

解决办法有如下:

修改@@sql_mode,去除ONLY_FULL_GROUP_BY模式 或 直接使用宽松模式
使用any_value从组中读取第一个值:select any_value(name) as name, age from person where group by age

不受ONLY_FULL_GROUP_BY模式约束的情况:

  • select target list 为聚合函数,如sum、max、min、count等;
  • group by 的字段为主键或UNIQUE NOT NULL时,可以 select 其他字段。
posted @ 2020-08-06 13:51  Mr_Kahn  阅读(141)  评论(0)    收藏  举报