diff --git a/docs/MatrixOne-Cloud/App-Develop/schema-design/data-integrity/foreign-key-constraints.md b/docs/MatrixOne-Cloud/App-Develop/schema-design/data-integrity/foreign-key-constraints.md index a3714ea..0a4c38a 100644 --- a/docs/MatrixOne-Cloud/App-Develop/schema-design/data-integrity/foreign-key-constraints.md +++ b/docs/MatrixOne-Cloud/App-Develop/schema-design/data-integrity/foreign-key-constraints.md @@ -1,6 +1,6 @@ # FOREIGN KEY 外键约束 -FOREIGN KEY 约束可用于在跨表交叉引用相关数据时,保持相关数据的一致性。 +FOREIGN KEY 外键约束允许表内或跨表交叉引用相关数据,有助于保持相关数据的一致性。 **遵循规则** @@ -22,9 +22,11 @@ FOREIGN KEY 约束可用于在跨表交叉引用相关数据时,保持相关 **外键特性** +- 外键自引用:是指一个表中的列引用同一个表的主键。这种设计通常用于表示层级关系或父子关系,比如组织结构、分类目录等。 + - 多列外键:这种外键是在一个表中两个或更多的列联合起来引用另一个表的主键。也就是说,这些列共同定义了对另一个表的引用。它们必须以组的形式存在,且需要同时满足外键约束。 -- 多层外键:这种情况通常涉及到三个或更多的表,并且它们之间存在依赖关系。A 表的主键可以是 B 表的外键,而 B 表的主键又可以是 C 表的外键,形成多层外键的情况。 +- 多层外键:这种情况通常涉及到三个或更多的表,并且它们之间存在依赖关系。一个表的外键可以是另一个表的主键,而这个表的外键又可以是第三个表的主键,形成多层外键的情况。 ## 语法说明 @@ -96,7 +98,45 @@ ERROR 20101 (HY000): internal error: Cannot add or update a child row: a foreign **示例解释**:在上述示例中,t2 的 c 列只能引用 t1 中 a 列的值或空值,因此插入 t2 的前 3 行操作都能够成功插入,但是第 4 行中的 103 并不是 t1 中 a 列的某个值,违反了外键约束,因此插入失败。 -### 示例 2 - 多列外键 +### 示例 2 - 外键自引用 + +```sql +-- 创建名为 categories 的表,用于存储商品分类信息 +CREATE TABLE categories ( + id INT AUTO_INCREMENT PRIMARY KEY,--id 是主键,用于唯一标识每个分类 + name VARCHAR(255) NOT NULL,--name 是分类的名称 + parent_id INT, + FOREIGN KEY (parent_id) REFERENCES categories(id)--parent_id 是一个外键,它引用了 categories 表中的 id 列 +); + +--parent_id 列允许我们指定一个分类的父分类。如果没有父分类(即顶级分类),parent_id 可以设置为 NULL。接下来,我们可以插入一些数据来展示这种层级关系: + +--插入顶级分类 +mysql> INSERT INTO categories (name) VALUES ('Electronics'),('Books'); +Query OK, 2 rows affected (0.01 sec) + +--插入子分类 +mysql> INSERT INTO categories (name, parent_id) VALUES ('Laptops', 1),('Smartphones', 1),('Science Fiction', 2),('Mystery', 2); +Query OK, 4 rows affected (0.01 sec) + +mysql> select * from categories; ++------+-----------------+-----------+ +| id | name | parent_id | ++------+-----------------+-----------+ +| 1 | Electronics | NULL | +| 2 | Books | NULL | +| 3 | Laptops | 1 | +| 4 | Smartphones | 1 | +| 5 | Science Fiction | 2 | +| 6 | Mystery | 2 | ++------+-----------------+-----------+ +6 rows in set (0.01 sec) + +``` + +**示例解释**:上述代码中,我们了创建名为 `categories` 的表,用于存储商品分类信息,首先插入了两个顶级分类 `Electronics` 和 `Books`。然后,我们为每个顶级分类添加了子分类,比如 `Laptops` 和 `Smartphones` 是 `Electronics` 的子分类,而 `Science Fiction` 和 `Mystery` 是 `Books` 的子分类。 + +### 示例 3 - 多列外键 ```sql -- 创建一个名为"Student"的表,用于存储学生信息 @@ -125,7 +165,7 @@ CREATE TABLE StudentCourse ( **示例解释**:上述示例中,一个是学生表 (Student),一个是课程表 (Course),还有一个选课表 (StudentCourse) 用于记录哪个学生选择了哪门课程。在这种情况下,选课表中的学生 ID 和课程 ID 可以作为外键,共同引用学生表和课程表的主键。 -### 示例 3 - 多层外键 +### 示例 4 - 多层外键 ```sql -- 创建一个名为"Country"的表,用于存储国家信息 diff --git a/docs/MatrixOne-Cloud/Reference/Data-Types/data-types.md b/docs/MatrixOne-Cloud/Reference/Data-Types/data-types.md index bac4733..d164c6c 100644 --- a/docs/MatrixOne-Cloud/Reference/Data-Types/data-types.md +++ b/docs/MatrixOne-Cloud/Reference/Data-Types/data-types.md @@ -1,9 +1,9 @@ -# **数据类型** +# 数据类型 MatrixOne 的数据类型与 MySQL 数据类型的定义一致,可参考: -## **整数类型** +## 整数类型 | 数据类型 | 存储空间 | 最小值 | 最大值 | | ---- | ---- | ---- | ---- | @@ -16,7 +16,7 @@ MatrixOne 的数据类型与 MySQL 数据类型的定义一致,可参考: | INT UNSIGNED | 4 byte | 0 | 4294967295 | | BIGINT UNSIGNED | 8 byte | 0 | 18446744073709551615 | -### **示例** +### 示例 - TINYINT and TINYINT UNSIGNED @@ -97,14 +97,14 @@ mysql> select * from inttable; 2 rows in set (0.01 sec) ``` -## **浮点类型** +## 浮点类型 | 数据类型 | 存储空间 | 精度 | 最小值 | 最大值 | 语法表示 | | ---- | ---- | ---- | ---- |---- |---- | | FLOAT32 | 4 bytes | 23 bits |-3.40282e+038|3.40282e+038| FLOAT(M, D)
M 表示的是最大长度,D 表示的显示的小数位数。M 的取值范围为(1=< M <=255)。
D 的取值范围为(1=< D <=30),且 M >= D。
带精度的浮点数展示出要求精度的位数,在位数不足时,会进行末尾补 0。| | FLOAT64 | 8 bytes | 53 bits |-1.79769e+308|1.79769e+308| DOUBLE(M, D)
M 表示的是最大长度,D 表示的显示的小数位数。M 的取值范围为(1=< M <=255)。
D 的取值范围为(1=< D <=30),且 M >= D。
带精度的浮点数展示出要求精度的位数,在位数不足时,会进行末尾补 0。| -### **示例** +### 示例 ```sql -- Create a table named "floatt1" with precision, a trailing zero is added when the number of bits falls short @@ -145,7 +145,7 @@ mysql> select min(big),max(big),max(big)-1 from floattable; 1 row in set (0.05 sec) ``` -## **字符串类型** +## 字符串类型 | 数据类型 | 存储空间 | 长度 | 语法表示 | 描述| | ---- | ---- | --- | ---- |---- | @@ -157,7 +157,7 @@ mysql> select min(big),max(big),max(big)-1 from floattable; | blob | 1 GB | other types mapping |BLOB|二进制的长文本数据,不区分 TINY BLOB、MEDIUM BLOB 和 LONGBLOB| | enum | 1 byte 或 2 bytes | 0 ~ 65535 | enum | 一个枚举类型。它是一个字符串对象,只能从 `value1`、`value2` 等值列表中选择一个值,或者是 `NULL` 或特殊的 '' 错误值。枚举值在内部表示为整数。 | -### **示例** +### 示例 - CHAR 和 VARCHAR @@ -262,14 +262,14 @@ mysql> SELECT * FROM enumtest WHERE color = 'green'; 1 row in set (0.01 sec) ``` -## **JSON 数据类型** +## JSON 数据类型 |JSON 数据类型 | 解释 | |---|---| |对象 |对象使用 `{}` 括起来,元素之间用 `,` 分隔。JSON 对象中的值/键可以为 String、Nubmber、Bool、时间。| |数组 | 数组使用 `[]` 括起来,元素之间用逗号 `,` 分隔。JSON 数组中值可以为 String、Nubmber、Bool、时间。| -### **示例** +### 示例 ```sql -- Create a table named "jsontest" with 1 attribute of a "json" @@ -286,33 +286,42 @@ mysql> select * from jsontest; 2 rows in set (0.01 sec) ``` -## **时间与日期** +## 时间与日期类型 | 数据类型 | 存储空间 | 精度 | 最小值 | 最大值 | 语法表示 | | ---- | ---- | ---- | ---- | ---- | ---- | -| Time | 8 byte | microsecond | -2562047787:59:59.999999 | 2562047787:59:59.999999 | hh:mm:ss.ssssss | +| Time | 8 byte | microsecond | -2562047787:59:59.999999 | 2562047787:59:59.999999 | hh:mm:ss.ssssss | | Date | 4 byte | day | 0001-01-01 | 9999-12-31 | YYYY-MM-DD/YYYYMMDD | | DateTime | 8 byte | microsecond | 0001-01-01 00:00:00.000000 | 9999-12-31 23:59:59.999999 | YYYY-MM-DD hh:mi:ssssss | | TIMESTAMP|8 byte|microsecond|0001-01-01 00:00:00.000000|9999-12-31 23:59:59.999999|YYYYMMDD hh:mi:ss.ssssss| -### **示例** +时间与日期部分类型支持在插入数据时添加以下 hint 值: + +- `Time`:{t 'xx'},{time 'xx'} + +- `Date`:{d 'xx'},{date 'xx'} + +- `TIMESTAMP`:{ts 'xx'},{timestamp 'xx'} + +### 示例 - TIME ```sql -- Create a table named "timetest" with 1 attributes of a "time" create table time_02(t1 time); -insert into time_02 values(200); -insert into time_02 values(""); +insert into time_02 values(200),(time'23:29:30'),({t'12:11:12'}),(''); mysql> select * from time_02; +----------+ | t1 | +----------+ | 00:02:00 | +| 23:29:30 | +| 12:11:12 | | NULL | +----------+ -2 rows in set (0.00 sec) +4 rows in set (0.01 sec) ``` - DATE @@ -320,17 +329,17 @@ mysql> select * from time_02; ```sql -- Create a table named "datetest" with 1 attributes of a "date" create table datetest (a date not null, primary key(a)); -insert into datetest values ('2022-01-01'), ('20220102'),('2022-01-03'),('20220104'); - -mysql> select * from datetest order by a asc; +insert into datetest values ({d'2022-01-01'}), ('20220102'),(date'2022-01-03'),({d now()}); +mysql> select * from datetest; +------------+ | a | +------------+ | 2022-01-01 | | 2022-01-02 | | 2022-01-03 | -| 2022-01-04 | +| 2024-03-19 | +------------+ +4 rows in set (0.00 sec) ``` - DATETIME @@ -357,27 +366,28 @@ mysql> select * from datetimetest order by a asc; ```sql -- Create a table named "timestamptest" with 1 attribute of a "timestamp" create table timestamptest (a timestamp(0) not null, primary key(a)); -insert into timestamptest values ('20200101000000'), ('2022-01-02'), ('2022-01-02 00:00:01'), ('2022-01-02 00:00:01.512345'); +insert into timestamptest values ('20200101000000'), (timestamp'2022-01-02 11:30:40'), ({ts'2022-01-02 00:00:01'}), ({ts current_timestamp}); mysql> select * from timestamptest; +---------------------+ | a | +---------------------+ | 2020-01-01 00:00:00 | -| 2022-01-02 00:00:00 | +| 2022-01-02 11:30:40 | | 2022-01-02 00:00:01 | -| 2022-01-02 00:00:02 | +| 2024-03-19 17:22:08 | +---------------------+ +4 rows in set (0.00 sec) ``` -## **Bool** +## Bool 类型 | 数据类型 | 存储空间 | | ---- | ---- | | True | 1 byte | |False|1 byte| -### **示例** +### 示例 ```sql -- Create a table named "booltest" with 2 attribute of a "boolean" and b "bool" @@ -397,14 +407,14 @@ mysql> select * from booltest; 5 rows in set (0.00 sec) ``` -## **定点类型 Decimal** +## 定点类型 Decimal | 数据类型 | 存储空间 | 精度 | 语法表示 | | ---- | ---- | ---- | ---- | | Decimal64 | 8 byte | 18 位 | Decimal(N,S)
N 表示数字位数的总数,范围是 (1 ~ 18),小数点和 -(负数)符号不包括在 N 中。
如果 N 被省略,默认值应该取最大,即取值 18。
S 表示是小数点(标度)后面的位数,范围是 (0 ~ N)
如果 S 是 0,则值没有小数点或分数部分。如果 S 被省略,默认是 0,例如 Decimal(10),等同于 Decimal(10, 0)
例如 Decimal(10,8),即表示数字总长度为 10,小数位为 8。| | Decimal128 | 16 byte | 38 位 | Decimal(N,S)
N 表示数字位数的总数,范围是 (18 ~ 38),小数点和 -(负数)符号不包括在 N 中。
如果 N 被省略,默认值应该取最大,即取值 38。
S 表示是小数点(标度)后面的位数,范围是 (0 ~ N)
如果 S 是 0,则值没有小数点或分数部分。如果 S 被省略,默认是 0,例如 Decimal(20),等同于 Decimal(20, 0)。
例如 Decimal(20,19),即表示数字总长度为 20,小数位为 19。 | -### **示例** +### 示例 ```sql -- Create a table named "decimalTest" with 2 attribute of a "decimal" and b "decimal" @@ -420,13 +430,13 @@ mysql> select * from decimalTest; 1 row in set (0.01 sec) ``` -## **UUID 类型** +## UUID 类型 |UUID 类型 | 解释 | |---|---| |[UUID](uuid-type.md) | 由 32 个 16 进制数字和 4 个连字符‘-’组成 UUID 值,形式为 8-4-4-4-12,标准的 UUID 示例:`a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11`。| -### **示例** +### 示例 ```sql -- 创建一个名为 't1' 的新表,并设置 'a' 列为 UUID 类型,同时将 'a' 列设置为主键 @@ -453,3 +463,25 @@ mysql> select * from t1; +--------------------------------------+ 1 row in set (0.00 sec) ``` + +## 向量数据类型 + +|类型 | 解释 | +|------------|--------------------- | +|vecf32 | 向量列类型为 float32 | +|vecf64 | 向量列类型为 float64 | + +### 示例 + +```sql +create table t1(n1 vecf32(3), n2 vecf64(2)); +insert into t1 values("[1,2,3]",'[4,5]'); + +mysql> select * from t1; ++-----------+--------+ +| n1 | n2 | ++-----------+--------+ +| [1, 2, 3] | [4, 5] | ++-----------+--------+ +1 row in set (0.00 sec) +``` \ No newline at end of file diff --git a/docs/MatrixOne-Cloud/Reference/Functions-and-Operators/Aggregate-Functions/count.md b/docs/MatrixOne-Cloud/Reference/Functions-and-Operators/Aggregate-Functions/count.md index 935da2a..6620c97 100644 --- a/docs/MatrixOne-Cloud/Reference/Functions-and-Operators/Aggregate-Functions/count.md +++ b/docs/MatrixOne-Cloud/Reference/Functions-and-Operators/Aggregate-Functions/count.md @@ -2,7 +2,7 @@ ## **函数说明 n** -`COUNT()` 是聚合函数的一种,计算了查询结果的记录数(`NULL` 值不参与统计)。 +`COUNT()` 是聚合函数的一种,计算了查询结果的记录数,结果是一个 BIGINT 值。当没有匹配的行或 `COUNT(NULL)` 时返回 0。 ## **函数语法** @@ -10,30 +10,38 @@ > COUNT(expr) ``` -*** +``` +> COUNT(distinct column) +``` ## **参数释义** -| 参数 | 说明 | -| ---- | ---- | -| expr | 任何查询结果,既可以是列名,也可以是一个函数或者数学运算的结果。也可以使用`*`,直接统计行数。| - -## **返回值** - -返回查询结果中 `expr` 列的 `NOT NULL` 的值的个数,返回数据类型为 `BIGINT`。 -如果没有匹配的行,将返回 0。 + + + + + + + + + + + + + +
参数说明
expr任何查询结果,既可以是列名,也可以是一个函数或者数学运算的结果。当不带 distinct 参数时也可以使用 `*`,直接统计行数
distinct column对列中重复值去重。
## **示例** ```sql -> drop table if exists tbl1,tbl2; -> create table tbl1 (col_1a tinyint, col_1b smallint, col_1c int, col_1d bigint, col_1e char(10) not null); -> insert into tbl1 values (0,1,1,7,"a"); -> insert into tbl1 values (0,1,2,8,"b"); -> insert into tbl1 values (0,1,3,9,"c"); -> insert into tbl1 values (0,1,4,10,"D"); -> insert into tbl1 values (0,1,5,11,"a"); -> insert into tbl1 values (0,1,6,12,"c"); +drop table if exists tbl1,tbl2; +create table tbl1 (col_1a tinyint, col_1b smallint, col_1c int, col_1d bigint, col_1e char(10) not null); +insert into tbl1 values (0,1,1,7,"a"); +insert into tbl1 values (0,1,2,8,"b"); +insert into tbl1 values (0,1,3,9,"c"); +insert into tbl1 values (0,1,4,10,"D"); +insert into tbl1 values (0,1,5,11,"a"); +insert into tbl1 values (0,1,6,12,"c"); > select count(col_1b) from tbl1; +---------------+ @@ -48,4 +56,11 @@ +----------+ | 3 | +----------+ + +mysql> select count(distinct col_1b) from tbl1; ++------------------------+ +| count(distinct col_1b) | ++------------------------+ +| 1 | ++------------------------+ ``` diff --git a/docs/MatrixOne-Cloud/Reference/SQL-Reference/Data-Manipulation-Language/load-data.md b/docs/MatrixOne-Cloud/Reference/SQL-Reference/Data-Manipulation-Language/load-data.md index 8732e50..bd396bc 100644 --- a/docs/MatrixOne-Cloud/Reference/SQL-Reference/Data-Manipulation-Language/load-data.md +++ b/docs/MatrixOne-Cloud/Reference/SQL-Reference/Data-Manipulation-Language/load-data.md @@ -14,6 +14,7 @@ > LOAD DATA [LOCAL] INFILE 'file_name' INTO TABLE tbl_name + [CHARACTER SET charset_name] [{FIELDS | COLUMNS} [TERMINATED BY 'string'] [[OPTIONALLY] ENCLOSED BY 'char'] @@ -37,6 +38,17 @@ `file_name` 可以是文件的存放位置的相对路径名称,也可以是绝对路径名称。 +### CHARACTER SET + +如果文件内容使用与默认值不同的字符集,可使用 `CHARACTER SET` 指定字符集。例如,你可以使用 `CHARACTER SET utf8` 指定导入内容字符集为 utf8: + +``` +LOAD DATA INFILE 'yourfilepath' INTO TABLE xx CHARACTER SET utf8; +``` + +!!! note + 除了 utf8 外,`LOAD DATA` 还支持指定 utf_8、UTF_16、UTF_xx、gbk、abcd 等字符集。暂不支持指定带有 **-**(如 utf-8,UTF-16) 的字符集。 + ### IGNORE LINES `IGNORE number LINES` 子句可用于忽略文件开头的行。例如,你可以使用 `IGNORE 1 LINES` 跳过包含列名的初始标题行: diff --git a/docs/MatrixOne-Cloud/Reference/SQL-Reference/Data-Manipulation-Language/upsert/insert-ignore.md b/docs/MatrixOne-Cloud/Reference/SQL-Reference/Data-Manipulation-Language/upsert/insert-ignore.md new file mode 100644 index 0000000..2cb4f9c --- /dev/null +++ b/docs/MatrixOne-Cloud/Reference/SQL-Reference/Data-Manipulation-Language/upsert/insert-ignore.md @@ -0,0 +1,52 @@ +# INSERT IGNORE + +## 语法描述 + +`INSERT IGNORE` 用于在向具有相同唯一索引或主键的数据库表中插入数据时,如果数据已经存在,则忽略该数据,而不是返回报错,否则插入新的数据。 + +与 MySQL 不同的是,在对唯一索引或主键插入重复值时,MatrixOne 会忽略报错,而 MySQL 会有告警信息。 + +## 语法结构 + +``` +> INSERT IGNORE INTO [db.]table [(c1, c2, c3)] VALUES (v11, v12, v13), (v21, v22, v23), ...; +``` + +## 示例 + +```sql +CREATE TABLE user ( + id INT(11) NOT NULL PRIMARY KEY, + name VARCHAR(50) NOT NULL, + age INT(3) NOT NULL +); +-- 插入一条新数据,id 不存在,于是录入新数据 +mysql> INSERT IGNORE INTO user VALUES (1, 'Tom', 18); +Query OK, 0 rows affected (0.02 sec) + +mysql> SELECT * FROM USER; ++------+------+------+ +| id | name | age | ++------+------+------+ +| 1 | Tom | 18 | ++------+------+------+ +1 row in set (0.01 sec) + +-- 再插入一条新数据,id 存在,于是数据忽略 +mysql> INSERT IGNORE INTO user VALUES (1, 'Jane', 16); +Query OK, 0 rows affected (0.00 sec) + +mysql> SELECT * FROM USER; ++------+------+------+ +| id | name | age | ++------+------+------+ +| 1 | Tom | 18 | ++------+------+------+ +1 row in set (0.01 sec) +``` + +## 限制 + +- `INSERT IGNORE` 不支持对 `NOT NULL` 列写入 `NULL`。 +- `INSERT IGNORE` 不支持对错误的数据类型转换。 +- `INSERT IGNORE` 不支持处理分区表中插入数据包含不匹配分区值的操作。 \ No newline at end of file diff --git a/docs/MatrixOne-Cloud/Reference/SQL-Reference/Data-Manipulation-Language/upsert/insert-on-duplicate-ignore.md b/docs/MatrixOne-Cloud/Reference/SQL-Reference/Data-Manipulation-Language/upsert/insert-on-duplicate-ignore.md deleted file mode 100644 index f5373f9..0000000 --- a/docs/MatrixOne-Cloud/Reference/SQL-Reference/Data-Manipulation-Language/upsert/insert-on-duplicate-ignore.md +++ /dev/null @@ -1,51 +0,0 @@ -# **INSERT ... ON DUPLICATE KEY IGNORE** - -## **语法描述** - -`INSERT ... ON DUPLICATE KEY IGNORE` 用于在向具有相同唯一索引或主键的数据库表中插入数据时,如果数据已经存在,则忽略该数据,而不是返回报错,否则插入新的数据。 - -`INSERT INTO` 语句是用于向数据库表中插入数据的标准语句,`ON DUPLICATE KEY IGNORE` 语句用于在表中有重复记录时进行忽略操作。如果表中存在具有相同唯一索引或主键的记录,则忽略该列,否则使用 `INSERT` 子句插入新记录。 - -## **语法结构** - -``` -> INSERT INTO [db.]table [(c1, c2, c3)] VALUES (v11, v12, v13), (v21, v22, v23), ... - [ON DUPLICATE KEY IGNORE]; -``` - -## **示例** - -```sql -CREATE TABLE user ( - id INT(11) NOT NULL PRIMARY KEY, - name VARCHAR(50) NOT NULL, - age INT(3) NOT NULL -); --- 插入一条新数据,id 不存在,于是录入新数据 -mysql> INSERT INTO user VALUES (1, 'Tom', 18) ON DUPLICATE KEY IGNORE; -Query OK, 0 rows affected (0.00 sec) - -mysql> SELECT * FROM USER; -+------+------+------+ -| id | name | age | -+------+------+------+ -| 1 | Tom | 18 | -+------+------+------+ -1 row in set (0.00 sec) - --- 再插入一条新数据,id 存在,于是数据忽略 -mysql> INSERT INTO user VALUES (1, 'Jane', 16) ON DUPLICATE KEY IGNORE; -Query OK, 0 rows affected (0.00 sec) - -mysql> SELECT * FROM USER; -+------+------+------+ -| id | name | age | -+------+------+------+ -| 1 | Tom | 18 | -+------+------+------+ -1 row in set (0.00 sec) -``` - -## **限制** - -`INSERT ... ON DUPLICATE KEY IGNORE` 使用唯一键(Unique key)或唯一索引(Unique index) 判断重复记录时,相应字段属性应为 `NOT NULL`,否则可能会导致一些未知错误。 diff --git a/docs/MatrixOne-Cloud/Reference/SQL-Reference/Data-Manipulation-Language/upsert/upsert.md b/docs/MatrixOne-Cloud/Reference/SQL-Reference/Data-Manipulation-Language/upsert/upsert.md index d040f99..edb19c5 100644 --- a/docs/MatrixOne-Cloud/Reference/SQL-Reference/Data-Manipulation-Language/upsert/upsert.md +++ b/docs/MatrixOne-Cloud/Reference/SQL-Reference/Data-Manipulation-Language/upsert/upsert.md @@ -24,15 +24,15 @@ 然而,`UPSERT` 命令在 Matrixone 中不存在,但仍然可以实现 `UPSERT`。默认情况下,Matrixone 提供了以下三种方式来实现 Matrixone UPSERT 操作: -- [INSERT ON DUPLICATE KEY IGNORE](insert-on-duplicate-ignore.md) +- [INSERT IGNORE](insert-ignore.md) - [INSERT ON DUPLICATE KEY UPDATE](insert-on-duplicate.md) - [REPLACE](replace.md) -## INSERT ON DUPLICATE KEY IGNORE +## INSERT IGNORE -当我们向表中插入非法行时,`INSERT ON DUPLICATE KEY IGNORE` 语句会忽略执行时的 error。比如,主键列不允许我们存储重复值。当我们使用 INSERT 向表中插入一条数据,而这条数据的主键已经在表中存在了,此时 Matrixone 服务器生成 error,语句执行失败。然而,当我们使用 `INSERT ON DUPLICATE KEY IGNORE` 来执行此语句时,Matrixone 服务器将不会生成 error。 +当我们向表中插入非法行时,`INSERT IGNORE` 语句会忽略执行时的 error。比如,主键列不允许我们存储重复值。当我们使用 INSERT 向表中插入一条数据,而这条数据的主键已经在表中存在了,此时 Matrixone 服务器生成 error,语句执行失败。然而,当我们使用 `INSERT IGNORE` 来执行此语句时,Matrixone 服务器将不会生成 error。 ## REPLACE diff --git a/docs/MatrixOne-Cloud/Reference/SQL-Reference/Data-Query-Language/select.md b/docs/MatrixOne-Cloud/Reference/SQL-Reference/Data-Query-Language/select.md index 75f00bb..0194630 100644 --- a/docs/MatrixOne-Cloud/Reference/SQL-Reference/Data-Query-Language/select.md +++ b/docs/MatrixOne-Cloud/Reference/SQL-Reference/Data-Query-Language/select.md @@ -26,6 +26,10 @@ SELECT `SELECT` 语句中最常用的子句或条件释义如下: +#### `all` & `distinct` + +`all` 和 `distinct` 修饰符指定是否应返回重复的行。`all`(默认值)指定应返回所有匹配的行,包括重复行。`distinct` 指定从结果集中删除重复的行。 + #### `select_expr` 每个 `select_expr` 表达式表示你需要查询的列,并且必须至少有一个 `select_expr`。 @@ -117,6 +121,32 @@ insert into t1 values (4,6,10); insert into t1 values (5,11,99); insert into t1 values (null,0,99); +mysql> SELECT spID FROM t1; ++------+ +| spid | ++------+ +| 1 | +| 2 | +| 2 | +| 3 | +| 1 | +| 4 | +| 5 | +| NULL | ++------+ + +mysql> SELECT DISTINCT spID FROM t1; ++------+ +| spid | ++------+ +| 1 | +| 2 | +| 3 | +| 4 | +| 5 | +| NULL | ++------+ + mysql> SELECT * FROM t1 WHERE spID>2 AND userID <2 || userID >=2 OR userID < 2 LIMIT 3; +------+--------+-------+ | spid | userid | score | diff --git a/docs/MatrixOne-Cloud/Reference/Variable/system-variables/lower_case_tables_name.md b/docs/MatrixOne-Cloud/Reference/Variable/system-variables/lower_case_tables_name.md index f352cd7..a018251 100644 --- a/docs/MatrixOne-Cloud/Reference/Variable/system-variables/lower_case_tables_name.md +++ b/docs/MatrixOne-Cloud/Reference/Variable/system-variables/lower_case_tables_name.md @@ -1,82 +1,57 @@ # lower_case_table_names 大小写敏感支持 -关于 MatrixOne 大小写模式有 5 种,大小写参数 `lower_case_table_names` 可以设置为 0,1,2,3 和 4。 +`lower_case_table_names` 是 MatrixOne 设置大小写是否敏感的一个全局变量。 -## 参数解释 +!!! note + 与 mysql 不同的是,MatrixOne 暂时只支持 **0** 和 **1** 两种模式,且在 linux 和 mac 系统下默认值都为 1。 -### 参数值设置为 0 +## 查看 lower_case_table_names -将 `lower_case_table_names` 设置为 0。标识符存储为原始字符串,名称比较时大小写敏感。 - -**示例** +在 MatrixOne 中使用以下命令查看 `lower_case_table_names`: ```sql -set global lower_case_table_names = 0; -create table Tt (Aa int); -insert into Tt values (1), (2), (3); - -mysql> select Aa from Tt; -+------+ -| Aa | -+------+ -| 1 | -| 2 | -| 3 | -+------+ -3 rows in set (0.03 sec) +show variables like "lower_case_table_names";--默认为 1 ``` -### 参数值设置为 1 - -将 `lower_case_table_names` 设置为 1。标识符存储为小写,名称比较时大小写不敏感。 +## 设置 lower_case_table_names -**示例** +在 MatrixOne 中使用以下命令设置 `lower_case_table_names`: ```sql -set global lower_case_table_names = 1; -create table Tt (Aa int); -insert into Tt values (1), (2), (3); - -mysql> select Aa from Tt; -+------+ -| aa | -+------+ -| 1 | -| 2 | -| 3 | -+------+ -3 rows in set (0.03 sec) +set global lower_case_table_names = 0;--默认为 1,重新连接数据库生效 ``` -```sql -set global lower_case_table_names = 1; -create table t(a int); -insert into t values(1), (2), (3); - --- 列的别名在返回结果集时会显示原始字符串,但名称比较时大小写不敏感,示例如下: -mysql> select a as Aa from t; -+------+ -| Aa | -+------+ -| 1 | -| 2 | -| 3 | -+------+ -3 rows in set (0.03 sec) -``` +## 参数解释 -### 参数值设置为 2 +### 参数设置为 0 -将 `lower_case_table_names` 设置为 2。标识符存储为原始字符串,名称比较时大小写不敏感。 +将 `lower_case_table_names` 设置为 0。标识符存储为原始字符串,名称比较大小写敏感。 **示例** ```sql -set global lower_case_table_names = 2; +mysql> show variables like "lower_case_table_names";--查看默认参数,默认值为 1 ++------------------------+-------+ +| Variable_name | Value | ++------------------------+-------+ +| lower_case_table_names | 1 | ++------------------------+-------+ +1 row in set (0.00 sec) + +set global lower_case_table_names = 0;--重新连接数据库生效 + +mysql> show variables like "lower_case_table_names";--重连数据库查看参数,修改成功 ++------------------------+-------+ +| Variable_name | Value | ++------------------------+-------+ +| lower_case_table_names | 0 | ++------------------------+-------+ +1 row in set (0.00 sec) + create table Tt (Aa int); -insert into tt values (1), (2), (3); +insert into Tt values (1), (2), (3); -mysql> select AA from tt; +mysql> select Aa from Tt;--名称比较大小写敏感 +------+ | Aa | +------+ @@ -87,69 +62,44 @@ mysql> select AA from tt; 3 rows in set (0.03 sec) ``` -### 参数值设置为 3 +### 参数设置为 1 -将 `lower_case_table_names` 设置为 3。标识符存储为大写,名称比较时大小写不敏感。 +将 `lower_case_table_names` 设置为 1。标识符存储为小写,名称比较大小写不敏感。 **示例** ```sql -set global lower_case_table_names = 3; -create table Tt (Aa int); -insert into Tt values (1), (2), (3); +set global lower_case_table_names = 1;--重新连接数据库生效 + +mysql> show variables like "lower_case_table_names";--重连数据库查看参数,修改成功 ++------------------------+-------+ +| Variable_name | Value | ++------------------------+-------+ +| lower_case_table_names | 1 | ++------------------------+-------+ +1 row in set (0.00 sec) + +create table Tt (Aa int,Bb int); +insert into Tt values (1,2), (2,3), (3,4); -mysql> select Aa from Tt; +mysql> select Aa from Tt;--名称比较大小写不敏感 +------+ -| AA | +| aa | +------+ | 1 | | 2 | | 3 | +------+ 3 rows in set (0.03 sec) -``` - -### 参数值设置为 4 - -将 `lower_case_table_names` 设置为 4。带有 `` 的标识符存储为原始字符串,大小写敏感,其他转小写。 - -## 配置参数 - -- 如需全局配置,可在启动 MatrixOne 之前,修改配置文件 `cn.toml`,插入以下代码并保存: -``` -[cn.frontend] -lowerCaseTableNames = "0" // 默认为 1 -# 0 标识符存储为原始字符串,名称比较时大小写时,大小写敏感 -# 1 标识符存储为小写,名称比较时大小写时,大小写不敏感 -# 2 标识符存储为原始字符串,名称比较时大小写时,大小写不敏感 -# 3 标识符存储为大写,名称比较时大小写时,大小写不敏感 -# 4 带有``的标识符存储为原始字符串,大小写敏感,其他转小写 -``` - -全局配置时,如果启动了多个 cn,那么每个 cn 都需要配置。 - -!!! note - 当前仅支持设置参数为 0 或 1。但暂不支持设置为参数为 2,3 和 4。 - -- 仅对当前会话开启大小写敏感支持: - -```sql -set lower_case_table_names = 1; -``` - -在创建数据库时,MatrixOne 会自动获取 `lower_case_table_names` 的值,作为初始化数据库配置的默认值。 - -## 与 MySQL 有差异的特性说明 - -MatrixOne lower_case_table_names 默认设置为 1,且仅支持设置该值为 0 或 1。 - -MySQL 默认如下: - -- Linux 系统中该值为 0,表示表名和数据库名按照在 CREATE TABLE 或 CREATE DATABASE 语句中指定的字母大小写存储在磁盘上,且名称比较时区分大小写。 -- Windows 系统中该值为 1,表示表名按照小写字母存储在磁盘上,名称比较时不区分大小写。MySQL 在存储和查询时将所有表名转换为小写。该行为也适用于数据库名称和表的别名。 -- macOS 系统中该值为 2,表示表名和数据库名按照在 CREATE TABLE 或 CREATE DATABASE 语句中指定的字母大小写存储在磁盘上,但 MySQL 在查询时将它们转换为小写。名称比较时不区分大小写。 - -## **限制** - -MatrixOne 系统变量 `lower_case_table_names` 大小写模式暂不支持设置值 2,3 和 4。 \ No newline at end of file +-- 列的别名在返回结果集时会显示原始字符串,但名称比较时大小写不敏感,示例如下: +mysql> select Aa as AA,Bb from Tt; ++------+------+ +| AA | bb | ++------+------+ +| 1 | 2 | +| 2 | 3 | +| 3 | 4 | ++------+------+ +3 rows in set (0.00 sec) +``` \ No newline at end of file diff --git a/docs/MatrixOne-Cloud/Reference/Variable/system-variables/sql-mode.md b/docs/MatrixOne-Cloud/Reference/Variable/system-variables/sql-mode.md index a11f36d..e099a99 100644 --- a/docs/MatrixOne-Cloud/Reference/Variable/system-variables/sql-mode.md +++ b/docs/MatrixOne-Cloud/Reference/Variable/system-variables/sql-mode.md @@ -1,205 +1,72 @@ # SQL 模式 -sql_mode 是 MatrixOne 中的一个系统参数,用于指定 MatrixOne 执行查询和操作的模式。sql_mode 可以影响 MatrixOne 的语法和语义规则,从而改变 MatrixOne 查询 SQL 的行为。在本篇文章中,将为你介绍 sql_mode 的作用、常见模式以及如何设置 SQL 模式。 - -## 为什么要设置 SQL 模式 - -sql_mode 可以控制 MatrixOne 的行为,包括如何处理 NULL 值、如何执行插入操作、如何排序和比较字符串等。它可以确保严格执行 SQL 标准,避免不符合标准的行为。此外,sql_mode 还可以帮助开发人员更好地排除 SQL 语句的错误和潜在问题。 - -## sql_mode 默认模式 - -sql_mode 常见的模式如下,在 MatrixOne 中也是默认的模式: - -- `ONLY_FULL_GROUP_BY`:`GROUP BY` 子句用于对查询结果进行分组,并对每个组执行聚合计算,例如 `COUNT`、`SUM`、`AVG` 等。在 `GROUP BY` 子句中,指定的列是用于分组的列。而在 `SELECT` 列表中,可以指定其他列,这些列可以是聚合函数或非聚合函数列。在没有 `ONLY_FULL_GROUP_BY` 模式的情况下,如果在 `SELECT` 列表中指定了非聚合函数列,MatrixOne 会默认选择任意一个与 `GROUP BY` 列匹配的值,并将其用于计算聚合函数。 +sql_mode 是 MatrixOne 中的一个系统参数,用于指定 MatrixOne 执行查询和操作的模式。sql_mode 可以影响 MatrixOne 的语法和语义规则,从而改变 MatrixOne 查询 SQL 的行为。在本篇文章中,将为你介绍 sql_mode 的模式、作用以及如何设置 SQL 模式。 !!! note - 如果你的表结构复杂,为了便于查询,你可以选择将 `ONLY_FULL_GROUP_BY` 模式关闭。 - -- `STRICT_TRANS_TABLES`:在执行 `INSERT` 和 `UPDATE` 语句时,如果数据不符合表定义的规则,则会报错。 - -- `NO_ZERO_IN_DATE`:禁止在 `DATE` 或 `DATETIME` 类型的字段中插入零值。 - -- `NO_ZERO_DATE`:禁止将 `0000-00-00` 作为日期或日期时间类型的字段值进行插入或更新操作,如果执行这样的操作,将会报错。该模式的作用是避免在日期或日期时间字段中插入无效或非法的值,强制要求使用有效的日期或日期时间值。需要注意的是,`NO_ZERO_DATE` 模式只对插入或更新操作有效,对于已经存在的 `0000-00-00` 值,可以继续查询和使用。 - -- `ERROR_FOR_DIVISION_BY_ZERO`:在执行除零操作时抛出错误。 - -- `NO_ENGINE_SUBSTITUTION`:该模式在执行 `ALTER TABLE` 或 `CREATE TABLE` 语句时,如果指定的存储引擎不可用或不存在,则会报错,而不是自动替换为另一个可用的存储引擎。该模式的作用是强制要求使用指定的存储引擎,防止出现数据不一致或性能问题。如果需要允许自动替换存储引擎,可以将该模式从 sql_mode 中移除或设置为其他支持的 sql_mode 模式。需要注意的是,该模式只对 `ALTER TABLE` 和 `CREATE TABLE` 语句有效,对于已经存在的表,其存储引擎不受 sql_mode 的影响。 - -## sql_mode 的可选模式 - -- ANSI:ANSI 是一种标准的 SQL 语言规范,由 ANSI(美国国家标准学会)制定。在 ANSI 模式下,SQL 语句必须符合 ANSI SQL 标准,这意味着你不能使用特定于某个数据库的 SQL 语言扩展或特性。 - -- ALLOW_INVALID_DATES:ALLOW_INVALID_DATES 在 MatrixOne SQL 模式中被称为**宽松模式(loose mode)**。在 ALLOW_INVALID_DATES 模式下,MatrixOne 允许插入一些在标准日期格式中是无效的日期,如 '0000-00-00' 或 '2000-00-00'。此模式是为了兼容一些早期版本的 MySQL 和非标准的日期格式而存在的。需要注意的是,在 ALLOW_INVALID_DATES 模式下插入无效日期可能会导致一些意外的行为,因为无效的日期不会被正确地处理。因此,建议始终使用标准日期格式。 - -- ANSI_QUOTES:ANSI_QUOTES 是 SQL 模式中的**严格模式(strict mode)**,用于更加严格地执行 SQL 标准。在 ANSI_QUOTES 模式下,MatrixOne 将双引号视为标识符引号,而不是字符串引号。这意味着,如果你想使用双引号引用一个标识符(如表名或列名),你必须使用双引号,而不是单引号。例如,以下 SQL 语句在 ANSI_QUOTES 模式下是正确的: - - ```sql - SELECT "column_name" FROM "table_name"; - ``` - - 而在默认的 SQL 模式下,使用双引号将会被解释为字符串引号,导致错误的语法。因此,如果你需要使用双引号引用标识符,你需要将 MatrixOne 设置为 ANSI_QUOTES 模式。 - - 需要注意的是,使用 ANSI_QUOTES 模式可能会导致与其他数据库系统的 SQL 语法不兼容,因为大多数其他数据库系统使用双引号作为字符串引号,而不是标识符引号。因此,在编写可移植的 SQL 语句时,应该谨慎使用 ANSI_QUOTES 模式。 - -- HIGH_NOT_PRECEDENCE:HIGH_NOT_PRECEDENCE 在 MatrixOne SQL 模式中被称为**高优先级 NOT 操作符(high-priority NOT operator)模式**。在 HIGH_NOT_PRECEDENCE 模式下,MatrixOne 将 NOT 操作符视为高优先级操作符,即它的优先级高于其他大多数操作符。这意味着,如果你在一个 SQL 语句中同时使用了 NOT 操作符和其他操作符,MatrixOne 会首先计算 NOT 操作符的结果,然后再计算其他操作符的结果。例如: - - ```sql - SELECT * FROM table WHERE NOT column = 1 AND column2 = 'value'; - ``` - - 在 HIGH_NOT_PRECEDENCE 模式下,MatrixOne 会先计算 NOT column = 1 的结果,再计算 column2 = 'value' 的结果。如果 NOT 操作符没有被正确地放置在语句中,可能会导致产生意外结果。 - - 需要注意的是,在 MatrixOne 的默认 SQL 模式中,NOT 操作符的优先级与其他操作符相同。如果你需要使用 HIGH_NOT_PRECEDENCE 模式,请确保你的 SQL 语句中正确地使用了括号来明确优先级。 - -- IGNORE_SPACE:IGNORE_SPACE 在 MatrixOne SQL 模式中被称为**忽略空格(ignore space)模式**。在 IGNORE_SPACE 模式下,MatrixOne 将忽略 SQL 语句中的多个空格或制表符,而只将一个空格或制表符视为分隔符。这意味着,在 IGNORE_SPACE 模式下,以下两个 SQL 语句是等效的: - - ```sql - SELECT * FROM my_table; - SELECT*FROM my_table; - ``` - - 这种模式的作用在于,使得 SQL 语句在书写时更加灵活,可以在各个关键字之间添加任意数量的空格或制表符,从而提高可读性。不过需要注意的是,在某些情况下,这种模式可能会导致意外的行为,例如当空格或制表符被错误地放置在 SQL 函数或列名中时,可能会导致语法错误。 - - 默认情况下,MatrixOne 不启用 IGNORE_SPACE 模式。如果需要启用该模式,可以在连接 MatrixOne 时使用 SQL 命令 SET sql_mode='IGNORE_SPACE' 来开启。 - -- NO_AUTO_VALUE_ON_ZERO:NO_AUTO_VALUE_ON_ZERO 在 MatrixOne SQL 模式中被称为**禁止自动增量列为 0(no auto value on zero)模式**。在 NO_AUTO_VALUE_ON_ZERO 模式下,当你向一个自动增量列插入值为 0 的数据时,MatrixOne 不会将该值视为自动增量值,而是将其视为普通的 0 值。这意味着,如果你向一个自动增量列插入值为 0 的数据,在 NO_AUTO_VALUE_ON_ZERO 模式下,该列的值不会自动增加,而是保持为 0。例如,以下 SQL 语句在 NO_AUTO_VALUE_ON_ZERO 模式下不会将 id 列自动增量: - - ```sql - CREATE TABLE my_table ( - id INT(11) NOT NULL AUTO_INCREMENT, - name VARCHAR(255) NOT NULL, - PRIMARY KEY (id) - ); - - INSERT INTO my_table (id, name) VALUES (0, 'John'); - ``` - - 在默认的 SQL 模式下,当你向一个自动增量列插入值为 0 的数据时,MatrixOne 会将该值视为自动增量值,自动将其增加为下一个可用的自动增量值。但是,在某些情况下,这可能不是你想要的行为,因此可以使用 NO_AUTO_VALUE_ON_ZERO 模式来禁止该行为。 - - 需要注意的是,如果你使用 NO_AUTO_VALUE_ON_ZERO 模式,插入值为 0 的数据可能会导致主键重复或唯一键冲突的问题。因此,在插入数据时需要格外注意。 - -- NO_BACKSLASH_ESCAPES:NO_BACKSLASH_ESCAPES 在 MatrixOne SQL 模式中被称为**禁止反斜杠转义(no backslash escapes)模式**。在 NO_BACKSLASH_ESCAPES 模式下,MatrixOne 不会将反斜杠视为转义符号。这意味着,在 SQL 语句中,你不能使用反斜杠来转义特殊字符,例如引号或百分号。相反,如果你需要在 SQL 语句中使用这些特殊字符,那就需要使用其他方式来转义它们,例如使用单引号来表示字符串中的双引号。例如,在 NO_BACKSLASH_ESCAPES 模式下,以下 SQL 语句会导致语法错误: - - ```sql - SELECT 'It's a nice day' FROM my_table; - ``` - - 在默认的 SQL 模式下,MatrixOne 允许使用反斜杠来转义特殊字符,因此可以在 SQL 语句中使用反斜杠来转义引号、百分号等字符。但是,在某些情况下,使用反斜杠转义可能会导致混淆或错误的结果,因此可以使用 NO_BACKSLASH_ESCAPES 模式来禁止该行为。 - - 需要注意的是,如果你使用 NO_BACKSLASH_ESCAPES 模式,那就需要使用其他方式来转义特殊字符,这可能会使 SQL 语句变得更加复杂和难以理解。因此,在使用该模式时需要仔细考虑。 - -- NO_DIR_IN_CREATE:NO_DIR_IN_CREATE 在 MatrixOne SQL 模式中被称为**禁止在 CREATE TABLE 中使用目录路径(no directory in create)模式**。在 NO_DIR_IN_CREATE 模式下,当你在 CREATE TABLE 语句中使用目录路径时,MatrixOne 会报错。目录路径指的是在列定义中使用的包含文件名的路径,例如: + 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 - CREATE TABLE my_table ( - id INT(11) NOT NULL AUTO_INCREMENT, - name VARCHAR(255) NOT NULL, - datafile '/var/lib/MatrixOne/my_table_data.dat', - PRIMARY KEY (id) - ); - ``` +## 查看 sql_mode - 在上面的 SQL 语句中,datafile 列定义了一个包含文件名的路径,指定了存储表数据的文件。在 NO_DIR_IN_CREATE 模式下,MatrixOne 不允许在 CREATE TABLE 语句中使用这种目录路径,而需要将文件路径和文件名分开定义,例如: +在 MatrixOne 中使用以下命令查看 sql_mode: - ```sql - CREATE TABLE my_table ( - id INT(11) NOT NULL AUTO_INCREMENT, - name VARCHAR(255) NOT NULL, - datafile VARCHAR(255) NOT NULL, - PRIMARY KEY (id) - ) DATA DIRECTORY '/var/lib/MatrixOne/' INDEX DIRECTORY '/var/lib/MatrixOne/'; - ``` - - 在上面的 SQL 语句中,datafile 列仅定义了文件名,而文件路径则在 CREATE TABLE 语句的 DATA DIRECTORY 和 INDEX DIRECTORY 子句中分别定义。 - - 需要注意的是,NO_DIR_IN_CREATE 模式不影响已经创建的表中的列定义,只影响 CREATE TABLE 语句中的列定义。因此,在使用该模式时需要仔细考虑,以确保你的 SQL 语句符合该模式的要求。 - -- NO_UNSIGNED_SUBTRACTION:NO_UNSIGNED_SUBTRACTION 在 MatrixOne SQL 模式中被称为**禁止无符号数减法(no unsigned subtraction)模式**。 - - 在 NO_UNSIGNED_SUBTRACTION 模式下,当你使用减法运算符 (-) 对无符号整数进行减法运算时,MatrixOne 会将结果视为有符号整数,而不是无符号整数。这意味着,如果无符号整数的值小于减数,结果将是负数,而不是无符号整数。例如: - - ```sql - SET SQL_MODE = 'NO_UNSIGNED_SUBTRACTION'; - SELECT CAST(1 AS UNSIGNED) - CAST(2 AS UNSIGNED); - ``` - - 在上面的 SQL 语句中,NO_UNSIGNED_SUBTRACTION 模式将 CAST(1 AS UNSIGNED) - CAST(2 AS UNSIGNED) 视为有符号整数运算,因此结果为 -1,而不是无符号整数运算的结果 4294967295。 - - 需要注意的是,NO_UNSIGNED_SUBTRACTION 模式只影响使用减法运算符 (-) 进行减法运算的无符号整数,其他使用无符号整数的运算不受影响。如果你需要在 MatrixOne 中进行大量的无符号整数运算,建议在代码中使用合适的类型转换来避免潜在的错误。 - -- PAD_CHAR_TO_FULL_LENGTH:PAD_CHAR_TO_FULL_LENGTH 在 MatrixOne SQL 模式中被称为**使用全字符集填充 CHAR 列(pad CHAR to full length)模式**。 - - 在 PAD_CHAR_TO_FULL_LENGTH 模式下,当你定义 CHAR 类型的列时,MatrixOne 会在该列的值后面使用空格填充,以使该值的长度达到该列定义的长度。这是因为在 MatrixOne 中,CHAR 类型的列在存储时总是占用定义的长度,不足部分会使用空格填充。但是,在默认情况下,MatrixOne 使用的字符集可能是多字节字符集,因此如果填充的字符是空格,可能会导致长度计算错误。 - - 在 PAD_CHAR_TO_FULL_LENGTH 模式下,MatrixOne 使用字符集的最大字符长度来填充 CHAR 类型的列,以确保占用的长度和定义的长度一致。这可以避免使用多字节字符集时计算长度错误的问题,但是也会增加存储空间的使用。 - - 需要注意的是,PAD_CHAR_TO_FULL_LENGTH 模式只影响 CHAR 类型的列,不影响其他类型的列。如果你需要在 MatrixOne 中使用 CHAR 类型的列,并且在多字节字符集下需要正确计算列值的长度,可以考虑使用 PAD_CHAR_TO_FULL_LENGTH 模式。 - -- PIPES_AS_CONCAT:PIPES_AS_CONCAT 在 MatrixOne SQL 模式中被称为**管道符作为字符串连接符(pipes as concatenation)模式**。在 PIPES_AS_CONCAT 模式下,MatrixOne 将竖线符号(|)视为字符串连接符,而不是位运算符。这意味着,如果你使用竖线符号连接两个字符串,MatrixOne 会将它们连接为一个字符串,而不是将它们看作是二进制位的运算。 - - 例如,以下 SQL 语句在默认模式下会返回错误,因为 MatrixOne 将竖线符号视为位运算符: - - ```sql - SELECT 'abc' | 'def'; - ``` - - 但是,如果将 SQL 模式设置为 PIPES_AS_CONCAT,则上面的 SQL 语句将返回字符串 'abcdef'。 - - 需要注意的是,如果你使用的 SQL 语句中包含竖线符号并且需要将其视为位运算符,请不要使用 PIPES_AS_CONCAT 模式。反之,如果你需要将竖线符号视为字符串连接符,请使用 PIPES_AS_CONCAT 模式。 - -- REAL_AS_FLOAT:REAL_AS_FLOAT 在 MatrixOne SQL 模式中被称为**将 REAL 类型视为 FLOAT 类型(real as float)模式**。 - - 在 REAL_AS_FLOAT 模式下,MatrixOne 将 REAL 类型的数据视为 FLOAT 类型的数据。这意味着,MatrixOne 将使用 FLOAT 类型的存储格式来存储 REAL 类型的数据,而不是使用更精确但也更占用空间的 DOUBLE 类型的存储格式。 - - 需要注意的是,由于 FLOAT 类型的数据存储格式比 DOUBLE 类型的数据占用更少的空间,因此在某些情况下,将 REAL 类型的数据视为 FLOAT 类型的数据可以节省存储空间。但是,这样做也会降低数据的精度,因为 FLOAT 类型的数据只能提供大约 7 位有效数字的精度,而 DOUBLE 类型的数据可以提供大约 15 位有效数字的精度。 - - 如果你需要在 MatrixOne 中存储精度较高的浮点数数据,建议不要使用 REAL_AS_FLOAT 模式,并使用 DOUBLE 类型的数据来存储。如果你对数据精度要求不高,可以考虑使用 REAL_AS_FLOAT 模式来节省存储空间。 - -- STRICT_ALL_TABLES:STRICT_ALL_TABLES 在 MatrixOne SQL 模式中被称为**启用严格模式(strict all tables)模式**。在 STRICT_ALL_TABLES 模式下,MatrixOne 启用了一系列的严格性检查,以确保插入、更新和删除操作符合数据类型、NULL 值和外键等约束。具体来说,STRICT_ALL_TABLES 模式会执行以下操作: - - 拒绝将非法值插入到任何列中。 - 拒绝将 NULL 值插入到非允许 NULL 的列中。 - 拒绝将超出允许范围的值插入到任何列中。 - 拒绝将字符串插入到数字类型的列中。 - 拒绝将日期或时间字符串插入到非日期或时间类型的列中。 - 拒绝将超出列定义长度的值插入到 CHAR、VARCHAR 和 TEXT 类型的列中。 - 拒绝将具有不匹配数据类型的值插入到外键列中。 - - 需要注意的是,启用严格模式可能会导致一些旧的应用程序出现问题,因为它们可能假定 MatrixOne 不会执行强制性的约束检查。如果你在更新或迁移应用程序时遇到问题,请考虑禁用严格模式或修改应用程序以符合严格模式的要求。 - -- TIME_TRUNCATE_FRACTIONAL:TIME_TRUNCATE_FRACTIONAL 在 MatrixOne SQL 模式中被称为**截断时间的小数部分(time truncate fractional)模式**。在 TIME_TRUNCATE_FRACTIONAL 模式下,MatrixOne 将截断 TIME、DATETIME 和 TIMESTAMP 类型的数据中的小数部分,只保留整数部分。这意味着,如果你将一个带有小数部分的时间数据插入到一个 TIME、DATETIME 或 TIMESTAMP 类型的列中,MatrixOne 会将小数部分截断,并将其设置为 0。 - - 需要注意的是,启用 TIME_TRUNCATE_FRACTIONAL 模式可能会导致一些数据的精度丢失,因为截断小数部分可能会丢失一些关键的时间信息。如果你需要存储和操作精确的时间数据,建议不要使用 TIME_TRUNCATE_FRACTIONAL 模式。 - -- TRADITIONAL:TRADITIONAL 是 MatrixOne SQL 模式中的一种模式,它被称为**传统模式(traditional)模式**。在 TRADITIONAL 模式下,MatrixOne 启用了一系列的严格性检查,以确保插入、更新和删除操作符合 SQL 标准的约束。具体来说,TRADITIONAL 模式会执行以下操作: - - 启用了 STRICT_TRANS_TABLES 和 STRICT_ALL_TABLES 模式。 - 拒绝在 INSERT 语句中省略列名,这样可以确保所有列都被明确地赋值。 - 拒绝将具有不明确数据类型的值插入到外键列中。 - 拒绝将字符串插入到数字类型的列中。 - 拒绝将日期或时间字符串插入到非日期或时间类型的列中。 - 拒绝将超出列定义长度的值插入到 CHAR、VARCHAR 和 TEXT 类型的列中。 - 拒绝在 GROUP BY 子句中使用非聚合列。 - 拒绝在 SELECT 语句中使用未列出的非聚合列。 - - 需要注意的是,启用传统模式可能会导致一些旧的应用程序出现问题,因为它们可能假定 MatrixOne 不会执行强制性的约束检查。如果你在更新或迁移应用程序时遇到问题,请考虑禁用传统模式或修改应用程序以符合传统模式的要求。 +```sql +SELECT @@global.sql_mode;--全局模式 +SELECT @@session.sql_mode;--会话模式 +``` -## 如何设置 sql_mode +## 设置 sql_mode -可以使用 `SET` 语句来设置 sql_mode,例如: +在 MatrixOne 中使用以下命令设置 sql_mode: ```sql -SET sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ONLY_FULL_GROUP_BY'; +set global sql_mode = 'xxx' --全局模式,重新连接数据库生效 +set session sql_mode = 'xxx'--会话模式 ``` -也可以在 MatrixOne 的配置文件中设置 sql_mode,例如: +## 示例 +```sql +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 ``` -sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ONLY_FULL_GROUP_BY; -``` - -在以上设置示例中,MatrixOne 将使用 `STRICT_TRANS_TABLES`、`NO_ZERO_IN_DATE` 和 `ONLY_FULL_GROUP_BY` 模式。 - -## 限制 - -MatrixOne 为兼容 MySQL,除支持 `ONLY_FULL_GROUP_BY` 模式以外,sql_mode 其他模式仅实现语法支持。