MySQL运维实战(4.3) SQL_MODE之ONLY_FULL_GROUP_BY

俊达2年前技术文章742

设置ONLY_FULL_GROUP_BY后,对有group by子句SQL,select的字段要么是group by中的字段,要么对字段进行聚合运算,否则sql执行报错。

不设置ONLY_FULL_GROUP_BY,则对于不在group by字段,不使用聚合函数也不会报错,mysql会随便选取数据返回。


准备测试数据:

mysql> create table t_group(a int, b int);
Query OK, 0 rows affected (0.02 sec)

mysql> insert into t_group values(1,1),(1,2),(2,2),(2,1);
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> select * from t_group;
+------+------+
| a    | b    |
+------+------+
|    1 |    1 |
|    1 |    2 |
|    2 |    2 |
|    2 |    1 |



设置ONLY_FULL_GROUP_BY

mysql> set sql_mode='ONLY_FULL_GROUP_BY';
Query OK, 0 rows affected (0.00 sec)

mysql> select a, b from t_group group by a;
ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'test_sqlmode.t_group.b' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by



不设置SQL_MODE:

mysql> set sql_mode='';
Query OK, 0 rows affected (0.00 sec)

mysql> select a, b from t_group group by a;
+------+------+
| a    | b    |
+------+------+
|    1 |    1 |
|    2 |    2 |
+------+------+
2 rows in set (0.00 sec)

上面的SQL虽然能执行,但是并不符合SQL标准。


总结

建议设置ONLY_FULL_GROUP_BY。生产环境修改SQL_MODE需要先进行兼容性测试。

相关文章

MySQL运维实战(7)建立复制

建立复制的基本步骤1、主库开启binlog主库需要配置的关键参数server_id:主备库需要设置为不同。log_bin:binlog文件的前缀,可以指定绝对路径,也可以只指定文件名。若不指定路径,b...

MySQL运维实战(4.1) MySQL表存储引擎

MySQL表的特点和其他数据库如Oracle、SQL Server相比,mysql有一些特点:MySQL使用插件式存储引擎,同一个数据库中的表可以使用不同的存储引擎。存储引擎决定了表的物理存储格式。表...

MySQL运维实战(2)MySQL用户和权限管理

MySQL用户管理基本命令创建用户使用create user命令创建用户create user 'username'@'host' ide...

MySQL运维实战之Clone插件(10.2)Clone插件原理

MySQL运维实战之Clone插件(10.2)Clone插件原理

clone插件实现clone操作主要分为几个阶段:1、初始阶段。初始阶段,会开启页面跟踪(Page Tracking)。开启页面跟踪后,修改过的页面的编号会被记录下来。页面的修改可分为两个阶段:首先在...

MySQL运维实战之备份和恢复(8.2)xtrabackup备份到云端(OSS)

xtrabackup工具中有一个xbcloud程序,可以将数据库直接备份到S3对象存储中,本地不落盘。这里介绍将数据库直接备份到OSS的一种方法。具体方法如下:1、准备OSS我们使用ossutil工具...

MySQL运维实战之ProxySQL(9.5)proxysql和MySQL Group Replication配合使用

如果后端MySQL使用了Group Replication,可通过配置mysql_group_replication_hostgroups表来实现高可用mysql_group_replication_...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。