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 其他字段。

浙公网安备 33010602011771号