From ed3201a7b5dfc1228097597b5da2c63c97462a5c Mon Sep 17 00:00:00 2001 From: "min.wu" <50101159+whitewum@users.noreply.github.com> Date: Wed, 6 May 2020 20:20:01 +0800 Subject: [PATCH 1/4] update quick start improve some --- .../1.overview/2.quick-start/1.get-started.md | 338 ++++++++++-------- 1 file changed, 187 insertions(+), 151 deletions(-) diff --git a/docs/manual-CN/1.overview/2.quick-start/1.get-started.md b/docs/manual-CN/1.overview/2.quick-start/1.get-started.md index 9397a6aa8a4..6d90485acd0 100644 --- a/docs/manual-CN/1.overview/2.quick-start/1.get-started.md +++ b/docs/manual-CN/1.overview/2.quick-start/1.get-started.md @@ -26,30 +26,62 @@ ### 创建并使用图空间 -**Nebula Graph** 中的图空间类似于传统数据库中创建的独立数据库,例如在 MySQL 中创建的数据库。首先,您需要创建一个图空间并使用它,然后才能执行其他操作。 +**Nebula Graph** 中的图空间类似于传统数据库中创建的独立数据库,例如在 MySQL 中创建的数据库。 +首先,您需要创建一个图空间并使用 (use) 它,然后才能执行其他操作。 您可以通过以下步骤创建并使用图空间: +0. 检查集群机器状态: + + ```ngql + nebula> SHOW HOSTS; + ================================================================================================ + | Ip | Port | Status | Leader count | Leader distribution | Partition distribution | + ================================================================================================ + | 192.168.8.210 | 44500 | online | | | | + ------------------------------------------------------------------------------------------------ + | 192.168.8.210 | 44500 | online | | | | + ``` + + 状态 `online` 表示**存储服务进程** `storaged` 已经成功连接上**元数据服务进程** `metad`。 + 1. 输入以下语句创建图空间: ```ngql nebula> CREATE SPACE nba; (partition_num=10, replica_factor=1); ``` - **注意**: + **这里**: - - `partition_num`:指定一个副本中的分区数。通常为集群硬盘数量的 5 倍。 - - `replica_factor`:指定集群中副本的数量,通常生产环境为 3,测试环境为 1。 + - `partition_num`:指定一个副本中的分区数。通常为全集群硬盘数量的 5 倍。 + - `replica_factor`:指定集群中副本的数量,通常生产环境为 3,测试环境可以为 1。 - 之后, 你也可以通过下面这个命令检查机器和 partition 分布: + 你可以通过 `SHOW HOSTS` 命令检查机器和 partition 分布情况: ```ngql nebula> SHOW HOSTS; + ================================================================================================ + | Ip | Port | Status | Leader count | Leader distribution | Partition distribution | + ================================================================================================ + | 192.168.8.210 | 44500 | online | 8 | nba: 8 | test: 8 | + ------------------------------------------------------------------------------------------------ + | 192.168.8.210 | 44500 | online | 2 | nba: 2 | test: 2 | ``` - 具体可以见[这里](../../2.query-language/4.statement-syntax/1.data-definition-statements/create-space-syntax.md) + 若发现机器都已在线 (online),但 Leader distribution 分布不均(如上),则可以通过命令 (`BALANCE LEADER`) 来触发 partition 重分布: -2. 输入以下语句使用图空间: + ```ngql + nebula> BALANCE LEADER; + ================================================================================================ + | Ip | Port | Status | Leader count | Leader distribution | Partition distribution | + ================================================================================================ + | 192.168.8.210 | 44500 | online | 5 | nba: 5 | test: 5 | + ------------------------------------------------------------------------------------------------ + | 192.168.8.210 | 44500 | online | 5 | nba: 5 | test: 5 | + ``` + 具体解释可以见[这里](../../2.query-language/4.statement-syntax/1.data-definition-statements/create-space-syntax.md) + +2. 输入以下语句来指定使用的图空间: ```ngql nebula> USE nba; @@ -101,77 +133,77 @@ nebula> CREATE EDGE serve(start_year int, end_year int); ``` -现在,您可以查看刚刚创建的标签和边类型。 +5. 现在,您可以查看刚刚创建的标签和边类型。 -要获取刚创建的标签,请输入以下语句: +5.1 要获取刚创建的标签,请输入以下语句: -```ngql -nebula> SHOW TAGS; -``` + ```ngql + nebula> SHOW TAGS; + ``` -返回以下信息: + 返回以下信息: -```ngql -============ -| Name | -============ -| player | ------------- -| team | ------------- -``` + ```ngql + ============ + | Name | + ============ + | player | + ------------ + | team | + ------------ + ``` -要显示刚创建的边类型,请输入以下语句: +5.2 要显示刚创建的边类型,请输入以下语句: -```ngql -nebula> SHOW EDGES; -``` + ```ngql + nebula> SHOW EDGES; + ``` -返回以下信息: + 返回以下信息: -```ngql -========== -| Name | -========== -| serve | ----------- -| follow | ----------- -``` + ```ngql + ========== + | Name | + ========== + | serve | + ---------- + | follow | + ---------- + ``` -要显示 **player** 标签的属性,请输入以下语句: +5.3 要显示 **player** 标签的属性,请输入以下语句: -```ngql -nebula> DESCRIBE TAG player; -``` + ```ngql + nebula> DESCRIBE TAG player; + ``` -返回以下信息: + 返回以下信息: -```ngql -=================== -| Field | Type | -=================== -| name | string | -------------------- -| age | int | -------------------- -``` + ```ngql + =================== + | Field | Type | + =================== + | name | string | + ------------------- + | age | int | + ------------------- + ``` -要获取 **follow** 边类型的属性,请输入以下语句: +5.4 要获取 **follow** 边类型的属性,请输入以下语句: -```ngql -nebula> DESCRIBE EDGE follow; -``` + ```ngql + nebula> DESCRIBE EDGE follow; + ``` -返回以下信息: + 返回以下信息: -```ngql -===================== -| Field | Type | -===================== -| degree | int | ---------------------- -``` + ```ngql + ===================== + | Field | Type | + ===================== + | degree | int | + --------------------- + ``` ## CRUD 操作 @@ -196,20 +228,22 @@ nebula> INSERT VERTEX player(name, age) VALUES 121:("Useless", 60); **注意**: -1. 在上面插入的点中,关键词 `VALUES` 之后的数字是点的 ID(缩写为 `VID`)。图空间中的 `VID` 必须是唯一的。 +1. 在上面插入的点中,关键词 `VALUES` 之后的数字是点的 ID(缩写为 `VID`, int64)。每个图空间中的 `VID` 必须是唯一的。 -2. 最后插入的点将在[删除数据](#删除数据)部分中删除。 +2. 最后插入的点(VID: 121)将在下文[删除数据](#删除数据)部分中删除。 -3. 如果您想一次插入多个同类型的点,可以执行以下语句: +3. 如果您想一次批量插入同类型的点,可以执行以下语句: -```ngql -nebula> INSERT VERTEX player(name, age) VALUES 100:("Tim Duncan", 42), \ -101:("Tony Parker", 36), 102:("LaMarcus Aldridge", 33); -``` + ```ngql + nebula> INSERT VERTEX player(name, age) VALUES 100:("Tim Duncan", 42), \ + 101:("Tony Parker", 36), 102:("LaMarcus Aldridge", 33); + ``` + + 反除号 `\` 用于实现多行语句。 #### 插入边 -`INSERT EDGE` 语句通过指定边类型名称、属性、起始点ID和目标点ID以及属性值来插入边。 +`INSERT EDGE` 语句通过指定边类型名称、属性、起始点VID和目标点VID以及属性值来插入边。 您可以通过以下语句插入边: @@ -221,19 +255,19 @@ nebula> INSERT EDGE serve(start_year, end_year) VALUES 100 -> 200:(1997, 2016); nebula> INSERT EDGE serve(start_year, end_year) VALUES 101 -> 201:(1999, 2018); ``` -**注意**:如果您想一次插入多条同类型的边,可以执行以下语句: +**同样的**:如果您想一次批量插入多条同类型的边,可以执行以下语句: ```ngql -INSERT EDGE follow(degree) VALUES 100 -> 101:(95),100 -> 102:(90),102 -> 101:(75); +INSERT EDGE follow(degree) VALUES 100 -> 101:(95), 100 -> 102:(90), 102 -> 101:(75); ``` -### 获取数据 +### 读取数据 -在 **Nebula Graph** 中插入数据后,您可以从图空间中检索到插入的数据。 +在 **Nebula Graph** 中插入数据后,您可以从图空间中查询到之前已经插入的数据。 -`FETCH PROP ON` 语句从图空间检索数据。如果要获取点数据,则必须指定点标签和点 ID;如果要获取边数据,则必须指定边类型名称、起始点 ID 和目标点 ID。 +`FETCH PROP ON` 语句从图空间检索数据。如果要获取点的数据,则必须指定点的标签和点 VID;如果要获取边数据,则必须指定边的类型、起始点 VID 和目标点 VID。 -要获取 `VID` 为 `100` 的选手的数据,请输入以下语句: +例如,要获取 `VID` 为 `100` 的选手的数据,请输入以下语句: ```ngql nebula> FETCH PROP ON player 100; @@ -249,7 +283,7 @@ nebula> FETCH PROP ON player 100; --------------------------------------- ``` -要获取 `VID` `100` 和 `VID` `200`之间的 `serve` 边的数据,请输入以下语句: +例如,要获取 `VID 100` 和 `VID 200` 之间的类型为 `serve` 的边上的属性,请输入以下语句: ```ngql nebula> FETCH PROP ON serve 100 -> 200; @@ -271,9 +305,11 @@ nebula> FETCH PROP ON serve 100 -> 200; #### 更新点数据 -`UPDATE VERTEX` 语句首先选择要更新的点,然后通过在等号右侧为其分配新值来更新点的数据。 +`UPDATE VERTEX` 语句用于更新点的属性。 + +指定要更新的点 `VID`,然后在等号右侧为其分配新值来更新点的全部或者部分属性。 -以下示例说明如何将 `VID` `100` 的 `name` 值从 `Tim Duncan` 更改为 `Tim`。 +以下示例说明如何将 `VID 100` 的属性 `name` 从 `Tim Duncan` 更改为 `Tim`。 输入以下语句更新 `name` 值: @@ -299,11 +335,13 @@ nebula> FETCH PROP ON player 100; #### 更新边数据 -`UPDATE EDGE` 语句通过指定边的起始点ID和目标点ID,然后在等号右侧为其分配新值来更新边的数据。 +类似的,`UPDATE EDGE` 语句用于更新边的属性。 + +通过指定边的起始点 VID 和目标点 VID,然后在等号右侧为其分配新值来更新边的属性。 -以下示例展示了如何更改 `VID` `100` 和 `VID` `101` 之间 `follow` 边的值。现在,我们将 `degree` 的值从 `95` 更改为 `96`。 +以下示例展示了如何更改 `VID 100` 和 `VID 101` 之间,类型为 `follow` 的边的属性。 -输入以下语句更新 `degree` 的值: +现在,我们将 `degree` 的值增加 `1`。 ```ngql nebula> UPDATE EDGE 100 -> 101 OF follow SET degree = follow.degree + 1; @@ -327,13 +365,11 @@ nebula> FETCH PROP ON follow 100 -> 101; ### 删除数据 -如果您有不需要的点或边数据,则可以从图空间中将其删除。 - #### 删除点 -您可以从图空间中删除任何点。`DELETE VERTEX` 语句通过指定点ID来删除点。 +`DELETE VERTEX` 语句通过指定点 VID 来删除点。**同时也会删除该点的所有标签,以及和该点相邻的所有入边和出边**。 -要删除 `VID` 为 `121` 的点,请输入以下语句: +要删除 `VID 121` 的点,请输入以下语句: ```ngql nebula> DELETE VERTEX 121; @@ -343,33 +379,30 @@ nebula> DELETE VERTEX 121; ```ngql nebula> FETCH PROP ON player 121; -``` - -返回以下信息: - -```ngql Execution succeeded (Time spent: 1571/1910 us) ``` -**注意**:上面返回结果为空的信息表示查询操作成功,但是由于数据已被删除,因此未能从图空间中查询到任何数据。 +上面返回结果为空,表示查询操作成功,但是由于数据已被删除,未能从图空间中查询到任何数据。 #### 删除边 -您可以从图空间中删除任何边。`DELETE EDGE` 语句通过指定边类型名称以及起始点ID和目标点ID来删除边。 +您可以从图空间中删除任何边。`DELETE EDGE` 语句通过指定边的类型以及起始点 VID 和目标点 VID 来删除边。 -要删除 `VID` `100` 和 `VID` `200` 之间的 `follow` 边,请输入以下语句: +要删除 `VID 100` 和 `VID 200` 之间的类型为 `follow` 的边,请输入以下语句: ```ngql nebula> DELETE EDGE follow 100 -> 200; ``` -**注意**:如果您删除了一个点,则该点所有的入边和出边都将被删除。 +## 其他 ### 查询示例 本节提供了更多查询示例供您参考。 -**示例一**: 查询 `VID` `100` 关注的点。 +## 示例1 + +查询球员 `VID 100` 关注 (follow) 的其他球员。 输入以下语句: @@ -389,14 +422,16 @@ nebula> GO FROM 100 OVER follow; --------------- ``` -**示例二**: 查询 `VID` `100` 关注的点且该点年龄大于 `35` 岁。 -返回其姓名和年龄并分别把列的名称设置为 **Teammate** 和 **Age**。 +## 示例2 + +查询球员 `VID 100` 关注的球员,被关注球员年龄需大于 `35` 岁。 +返回其姓名和年龄,并取别名为 **Teammate** 和 **Age**。 输入以下语句: ```ngql nebula> GO FROM 100 OVER follow WHERE $$.player.age >= 35 \ -YIELD $$.player.name AS Teammate, $$.player.age AS Age; + YIELD $$.player.name AS Teammate, $$.player.age AS Age; ``` 返回以下信息: @@ -409,62 +444,64 @@ YIELD $$.player.name AS Teammate, $$.player.age AS Age; --------------------- ``` -**注意**: +**这里**: -* `YIELD` 指定您希望从查询中返回的值或结果。 -* `$$` 表示目的点。 -* `\` 表示换行符。 +- `YIELD` 指定希望从查询中返回的结果。 +- `$$` 表示边上的目的点。 +- `\` 表示换行符。 -**示例三**: 查询球员 `100` 关注的球员所效力的球队。 +## 示例3 -有两种方法可获得相同的结果。首先,我们可以使用`管道`来检索球队。然后,我们使用`临时变量`来检索同一支球队。 +查询球员 `100` 关注的球员所效力的球队。 +有两种方法可获得相同的结果: -输入带`管道`的语句: +1. 使用 `管道(|)` 来组合两个查询语句 -```ngql -nebula> GO FROM 100 OVER follow YIELD follow._dst AS id | \ -GO FROM $-.id OVER serve YIELD $$.team.name \ -AS Team, $^.player.name AS Player; -``` + ```ngql + nebula> GO FROM 100 OVER follow YIELD follow._dst AS id | \ + GO FROM $-.id OVER serve YIELD $$.team.name AS Team, \ + $^.player.name AS Player; + ``` -返回如下信息: + 返回如下信息: -```ngql -=============================== -| Team | Player | -=============================== -| Nuggets | Tony Parker | -------------------------------- -``` + ```ngql + =============================== + | Team | Player | + =============================== + | Nuggets | Tony Parker | + ------------------------------- + ``` -输入带`临时变量`的语句: + **这里**: -```ngql -nebula> $var=GO FROM 100 OVER follow YIELD follow._dst AS id; \ -GO FROM $var.id OVER serve YIELD $$.team.name \ -AS Team, $^.player.name AS Player; -``` + - `$^` 表示边的起始点。 + - `|` 表示管道。 + - `$-` 表示输入流。上一个查询的输出`(id)`作为下一个查询的输入`($-.id)`。 -返回以下信息: +2. 使用`自定义的变量`来组合两个查询语句 -```ngql -=============================== -| Team | Player | -=============================== -| Nuggets | Tony Parker | -------------------------------- -``` + ```ngql + nebula> $var = GO FROM 100 OVER follow YIELD follow._dst AS id; \ + GO FROM $var.id OVER serve YIELD $$.team.name AS Team, \ + $^.player.name AS Player; + ``` -**注意**: + 返回以下信息: -* `$^` 表示起始点。 -* `|` 表示管道。上一个查询的输出作为下一个查询的输入。 -* `$-` 表示输入流。 -* 第二种方法采用用户自定义的变量 `$var`。该变量的范围仅在复合语句内。 + ```ngql + =============================== + | Team | Player | + =============================== + | Nuggets | Tony Parker | + ------------------------------- + ``` -## 批量插入 +当一条组合语句被整体提交给服务器后,该语句内的自定义变量就已结束生命周期。 -要插入多条数据,可以将所有 DDL(数据定义语言)语句放入 `.ngql` 文件中,如下所示。 +### 批量执行 + +通常测试时需要执行多条数据来准备环境,可以将所有语句放入一个 `.ngql` 文件中,如下所示。 ```ngql CREATE SPACE nba(partition_num=10, replica_factor=1); @@ -475,30 +512,29 @@ CREATE EDGE follow(degree int); CREATE EDGE serve(start_year int, end_year int); ``` -* 如果您是通过编译源代码来安装 **Nebula Graph**,则可以通过以下命令批量写入console: +在服务器: ```bash -$ cat schema.ngql | ./bin/nebula -u user -p password +$ cat schema.ngql | ./bin/nebula -u -p ``` -* 如果您通过 `docker-compose` 来使用 **Nebula Graph**,则可以通过以下命令批量写入console: +或者 `Docker` 中 ```bash $ cat nba.ngql | sudo docker run --rm -i --network=host \ -vesoft/nebula-console:nightly --addr=127.0.0.1 --port=3699 +vesoft/nebula-console:nightly --addr=<127.0.0.1> --port=<3699> ``` -**注意**: +**这里**: -* 您必须将 IP 地址和端口号更改为您自己的 IP 地址和端口号。 -* 您可以在[这里](https://oss-cdn.nebula-graph.com.cn/doc/nba.ngql)下载 `nba.ngql` 文件。 +- 必须将 --addr 和 --port 更改为您自己的 IP 地址和端口号。 +- 可以在[这里](https://oss-cdn.nebula-graph.com.cn/doc/nba.ngql)下载 `nba.ngql` 文件。 -同样,您可以在 *data.ngql* 文件中放置数百或数千个 DML(数据操作语言)语句来插入数据。 +### 批量导入 -## 导入数据工具 +如果您要插入数百万条记录,建议使用 [csv 导入工具](../../3.build-develop-and-administration/5.storage-service-administration/data-import/import-csv-file.md) 和 [Spark 导入工具](../../3.build-develop-and-administration/5.storage-service-administration/data-import/spark-writer.md) -如果您要插入数百万条记录,建议使用 [csv 导入工具](../../3.build-develop-and-administration/5.storage-service-administration/data-import/import-csv-file.md)。 - +### 最后 如果您在使用 **Nebula Graph** 的过程中遇到任何问题,请前往我们的 [官方论坛](https://discuss.nebula-graph.com.cn) 提问,将有专门的值班开发人员为您解答问题。 From 937430a175d171aa4d44693db226fa00e38b0c1b Mon Sep 17 00:00:00 2001 From: "min.wu" <50101159+whitewum@users.noreply.github.com> Date: Wed, 6 May 2020 20:22:17 +0800 Subject: [PATCH 2/4] Update 1.get-started.md --- docs/manual-CN/1.overview/2.quick-start/1.get-started.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/manual-CN/1.overview/2.quick-start/1.get-started.md b/docs/manual-CN/1.overview/2.quick-start/1.get-started.md index 6d90485acd0..56cded68ae5 100644 --- a/docs/manual-CN/1.overview/2.quick-start/1.get-started.md +++ b/docs/manual-CN/1.overview/2.quick-start/1.get-started.md @@ -205,7 +205,7 @@ --------------------- ``` -## CRUD 操作 +## 增删改查 ### 插入数据 From e81c7d71ccfad535bf768fa4dae2bcfd3f26df72 Mon Sep 17 00:00:00 2001 From: "min.wu" <50101159+whitewum@users.noreply.github.com> Date: Wed, 6 May 2020 20:23:39 +0800 Subject: [PATCH 3/4] Update 1.get-started.md --- docs/manual-CN/1.overview/2.quick-start/1.get-started.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/manual-CN/1.overview/2.quick-start/1.get-started.md b/docs/manual-CN/1.overview/2.quick-start/1.get-started.md index 56cded68ae5..f83060a2ca0 100644 --- a/docs/manual-CN/1.overview/2.quick-start/1.get-started.md +++ b/docs/manual-CN/1.overview/2.quick-start/1.get-started.md @@ -363,6 +363,10 @@ nebula> FETCH PROP ON follow 100 -> 101; ------------------------------------------------------------ ``` +### upsert + + + ### 删除数据 #### 删除点 From e1fc0caa8dcbfe11f507c612cbe9f0de36f25f0d Mon Sep 17 00:00:00 2001 From: whitewum Date: Fri, 8 May 2020 11:30:07 +0800 Subject: [PATCH 4/4] fix comments and rebase --- .../1.overview/2.quick-start/1.get-started.md | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/docs/manual-CN/1.overview/2.quick-start/1.get-started.md b/docs/manual-CN/1.overview/2.quick-start/1.get-started.md index f83060a2ca0..ba526fbeeec 100644 --- a/docs/manual-CN/1.overview/2.quick-start/1.get-started.md +++ b/docs/manual-CN/1.overview/2.quick-start/1.get-started.md @@ -40,7 +40,7 @@ ================================================================================================ | 192.168.8.210 | 44500 | online | | | | ------------------------------------------------------------------------------------------------ - | 192.168.8.210 | 44500 | online | | | | + | 192.168.8.211 | 44500 | online | | | | ``` 状态 `online` 表示**存储服务进程** `storaged` 已经成功连接上**元数据服务进程** `metad`。 @@ -48,7 +48,7 @@ 1. 输入以下语句创建图空间: ```ngql - nebula> CREATE SPACE nba; (partition_num=10, replica_factor=1); + nebula> CREATE SPACE nba (partition_num=10, replica_factor=1); ``` **这里**: @@ -65,7 +65,7 @@ ================================================================================================ | 192.168.8.210 | 44500 | online | 8 | nba: 8 | test: 8 | ------------------------------------------------------------------------------------------------ - | 192.168.8.210 | 44500 | online | 2 | nba: 2 | test: 2 | + | 192.168.8.211 | 44500 | online | 2 | nba: 2 | test: 2 | ``` 若发现机器都已在线 (online),但 Leader distribution 分布不均(如上),则可以通过命令 (`BALANCE LEADER`) 来触发 partition 重分布: @@ -77,8 +77,9 @@ ================================================================================================ | 192.168.8.210 | 44500 | online | 5 | nba: 5 | test: 5 | ------------------------------------------------------------------------------------------------ - | 192.168.8.210 | 44500 | online | 5 | nba: 5 | test: 5 | + | 192.168.8.211 | 44500 | online | 5 | nba: 5 | test: 5 | ``` + 具体解释可以见[这里](../../2.query-language/4.statement-syntax/1.data-definition-statements/create-space-syntax.md) 2. 输入以下语句来指定使用的图空间: @@ -87,7 +88,7 @@ nebula> USE nba; ``` - 现在,您可以通过以下语句查看刚创建的空间: +3. 现在,您可以通过以下语句查看刚创建的空间: ```ngql nebula> SHOW SPACES; @@ -135,7 +136,7 @@ 5. 现在,您可以查看刚刚创建的标签和边类型。 -5.1 要获取刚创建的标签,请输入以下语句: + 5.1. 要获取刚创建的标签,请输入以下语句: ```ngql nebula> SHOW TAGS; @@ -153,7 +154,7 @@ ------------ ``` -5.2 要显示刚创建的边类型,请输入以下语句: + 5.2. 要显示刚创建的边类型,请输入以下语句: ```ngql nebula> SHOW EDGES; @@ -171,7 +172,7 @@ ---------- ``` -5.3 要显示 **player** 标签的属性,请输入以下语句: + 5.3. 要显示 **player** 标签的属性,请输入以下语句: ```ngql nebula> DESCRIBE TAG player; @@ -189,7 +190,7 @@ ------------------- ``` -5.4 要获取 **follow** 边类型的属性,请输入以下语句: + 5.4. 要获取 **follow** 边类型的属性,请输入以下语句: ```ngql nebula> DESCRIBE EDGE follow; @@ -363,9 +364,11 @@ nebula> FETCH PROP ON follow 100 -> 101; ------------------------------------------------------------ ``` -### upsert + +TODO +--> ### 删除数据