SQL 模式
sql_mode 是 MatrixOne 中的一个系统参数,用于指定 MatrixOne 执行查询和操作的模式。sql_mode 可以影响 MatrixOne 的语法和语义规则,从而改变 MatrixOne 查询 SQL 的行为。在本篇文章中,将为你介绍 sql_mode 的模式、作用以及如何设置 SQL 模式。
Note
MatrixOne 目前只支持 ONLY_FULL_GROUP_BY
这一模式,其它模式仅作语法支持。ONLY_FULL_GROUP_BY
被用于控制 GROUP BY 语句的行为。当启用 ONLY_FULL_GROUP_BY
模式时,MatrixOne 要求在 SELECT 语句中的 GROUP BY 子句中的列必须是聚合函数 (如 SUM、COUNT 等) 或在 GROUP BY 子句中出现的列。如果 SELECT 语句中存在不符合这个要求的列,将会抛出错误,如果你的表结构复杂,为了便于查询,你可以选择将 ONLY_FULL_GROUP_BY
模式关闭。
查看 sql_mode
在 MatrixOne 中使用以下命令查看 sql_mode:
SELECT @@global.sql_mode;--全局模式
SELECT @@session.sql_mode;--会话模式
设置 sql_mode
在 MatrixOne 中使用以下命令设置 sql_mode:
set global sql_mode = 'xxx' --全局模式,重新连接数据库生效
set session sql_mode = 'xxx'--会话模式
示例
CREATE TABLE student(
id int,
name char(20),
age int,
nation char(20)
);
INSERT INTO student values(1,'tom',18,'上海'),(2,'jan',19,'上海'),(3,'jen',20,'北京'),(4,'bob',20,'北京'),(5,'tim',20,'广州');
mysql> select * from student group by nation;--在 `ONLY_FULL_GROUP_BY` 模式下不支持进行此操作
ERROR 1149 (HY000): SQL syntax error: column "student.id" must appear in the GROUP BY clause or be used in an aggregate function
mysql> SET session sql_mode='ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,STRICT_TRANS_TAB
LES';--关闭当前会话的 ONLY_FULL_GROUP_BY 模式
Query OK, 0 rows affected (0.02 sec)
mysql> select * from student group by nation;--在当前会话关闭 `ONLY_FULL_GROUP_BY` 模式立即生效
+------+------+------+--------+
| id | name | age | nation |
+------+------+------+--------+
| 1 | tom | 18 | 上海 |
| 3 | jen | 20 | 北京 |
| 5 | tim | 20 | 广州 |
+------+------+------+--------+
3 rows in set (0.00 sec)
mysql> SET global sql_mode='ONLY_FULL_GROUP_BY';--设置全局开启 ONLY_FULL_GROUP_BY 模式
Query OK, 0 rows affected (0.02 sec)
mysql> select * from student group by nation;--ONLY_FULL_GROUP_BY 模式未生效,因为全局模式开启后需要重连数据库方可生效
+------+------+------+--------+
| id | name | age | nation |
+------+------+------+--------+
| 1 | tom | 18 | 上海 |
| 3 | jen | 20 | 北京 |
| 5 | tim | 20 | 广州 |
+------+------+------+--------+
3 rows in set (0.00 sec)
mysql> exit --退出当前会话
mysql> select * from student group by nation;--重连数据库后执行查询操作,ONLY_FULL_GROUP_BY 模式成功开启
ERROR 1149 (HY000): SQL syntax error: column "student.id" must appear in the GROUP BY clause or be used in an aggregate function