diff --git a/docs/en/sql-reference/sql-functions/dict-functions/dict_mapping.md b/docs/en/sql-reference/sql-functions/dict-functions/dict_mapping.md index e2ddc975..1b27e5c5 100644 --- a/docs/en/sql-reference/sql-functions/dict-functions/dict_mapping.md +++ b/docs/en/sql-reference/sql-functions/dict-functions/dict_mapping.md @@ -4,7 +4,7 @@ displayed_sidebar: docs # dict_mapping -Returns value mapped to the specified key in a dictionary table. +value mapped to the specified key in a dictionary table. This function is mainly used to simplify the application of a global dictionary table. During data loading into a target table, StarRocks automatically obtains the value mapped to the specified key from the dictionary table by using the input parameters in this function, and then loads the value into the target table. diff --git a/docs/ja/sql-reference/sql-functions/dict-functions/dict_mapping.md b/docs/ja/sql-reference/sql-functions/dict-functions/dict_mapping.md new file mode 100644 index 00000000..36f3ba64 --- /dev/null +++ b/docs/ja/sql-reference/sql-functions/dict-functions/dict_mapping.md @@ -0,0 +1,215 @@ +--- +displayed_sidebar: docs +--- + +# dict_mapping + +ディクショナリテーブル内の指定されたキーにマップされた値。 + +この関数は、主にグローバル辞書テーブルの適用を簡素化するために使用されます。ターゲットテーブルへの データロード 中に、StarRocks はこの関数の入力パラメータを使用して、ディクショナリテーブルから指定されたキーにマップされた値を自動的に取得し、その値をターゲットテーブルに ロード します。 + +StarRocks は v3.2.5 以降、この関数をサポートしています。また、現在 StarRocks の 共有データモード はこの関数をサポートしていないことに注意してください。 + +## 構文 + +```SQL +dict_mapping("[.]", key_column_expr_list [, ] [, ] ) + +key_column_expr_list ::= key_column_expr [, key_column_expr ... ] + +key_column_expr ::= | +``` + +## パラメータ + +- 必須パラメータ: + - `[.]`: ディクショナリテーブルの名前。 主キーテーブル である必要があります。サポートされる データ型 は VARCHAR です。 + - `key_column_expr_list`: ディクショナリテーブル内のキー列の式リストで、1つ以上の `key_column_expr` を含みます。`key_column_expr` は、ディクショナリテーブル内の キー列 の名前、または特定のキーや キー式 のいずれかになります。 + + この式リストには、ディクショナリテーブルのすべての 主キー列 を含める必要があります。つまり、式の総数がディクショナリテーブルの 主キー列 の総数と一致する必要があります。したがって、ディクショナリテーブルが 複合主キー を使用する場合、このリスト内の式は、テーブルスキーマ で定義された 主キー列 にシーケンスで対応する必要があります。このリスト内の複数の式はコンマ (`,`) で区切られます。そして、`key_column_expr` が特定のキーまたはキー式である場合、その型はディクショナリテーブル内の対応する 主キー列 の型と一致する必要があります。 + +- オプションパラメータ: + - ``: 値列の名前。これはマッピング列でもあります。値列が指定されていない場合、デフォルトの値列はディクショナリテーブルの AUTO_INCREMENT 列です。値列は、自動増分列と 主キー を除くディクショナリテーブル内の任意の列として定義することもできます。列の データ型 に制限はありません。 + - `` (オプション): キーがディクショナリテーブルに存在しない場合に `NULL` を返すかどうか。有効な値: + - `true`: キーが存在しない場合、`NULL` が返されます。 + - `false` (デフォルト): キーが存在しない場合、例外がスローされます。 + +## 戻り値 + +戻り値の データ型 は、値列の データ型 と一貫しています。値列がディクショナリテーブルの 自動増分列 である場合、戻り値の データ型 は BIGINT です。 + +ただし、指定されたキーにマップされた値が見つからない場合、`` パラメータが `true` に設定されていると `NULL` が返されます。パラメータが `false` (デフォルト) に設定されている場合、`query failed if record not exist in dict table` というエラーが返されます。 + +## 例 + +**例 1: ディクショナリテーブルからキーにマップされた値を直接クエリします。** + +1. ディクショナリテーブルを作成し、模擬データを ロード します。 + + ```SQL + MySQL [test]> CREATE TABLE dict ( + order_uuid STRING, + order_id_int BIGINT AUTO_INCREMENT + ) + PRIMARY KEY (order_uuid) + DISTRIBUTED BY HASH (order_uuid); + Query OK, 0 rows affected (0.02 sec) + + MySQL [test]> INSERT INTO dict (order_uuid) VALUES ('a1'), ('a2'), ('a3'); + Query OK, 3 rows affected (0.12 sec) + {'label':'insert_9e60b0e4-89fa-11ee-a41f-b22a2c00f66b', 'status':'VISIBLE', 'txnId':'15029'} + + MySQL [test]> SELECT * FROM dict; + +------------+--------------+ + | order_uuid | order_id_int | + +------------+--------------+ + | a1 | 1 | + | a3 | 3 | + | a2 | 2 | + +------------+--------------+ + 3 rows in set (0.01 sec) + ``` + + > **注意** + > + > 現在、`INSERT INTO` ステートメント は 部分更新 をサポートしていません。したがって、`dict` の キー列 に挿入される値が重複しないようにしてください。そうしないと、ディクショナリテーブルに同じ キー列 の値が複数回挿入されると、そのマッピングされた値が値列で変更されます。 + +2. ディクショナリテーブルでキー `a1` にマップされた値をクエリします。 + + ```SQL + MySQL [test]> SELECT dict_mapping('dict', 'a1'); + +----------------------------+ + | dict_mapping('dict', 'a1') | + +----------------------------+ + | 1 | + +----------------------------+ + 1 row in set (0.01 sec) + ``` + +**例 2: テーブル内のマッピング列が `dict_mapping` 関数を使用して 生成列 として設定されています。これにより、StarRocks はこのテーブルにデータを ロード する際に、キーにマップされた値を自動的に取得できます。** + +1. データテーブルを作成し、`dict_mapping('dict', order_uuid)` を使用してマッピング列を 生成列 として設定します。 + + ```SQL + CREATE TABLE dest_table1 ( + id BIGINT, + -- この列は、文字列型の注文番号を記録し、例 1 の dict テーブルの order_uuid 列に対応します。 + order_uuid STRING, + batch int comment 'used to distinguish different batch loading', + -- この列は、order_uuid 列にマッピングされた BIGINT 型の注文番号を記録します。 + -- この列は dict_mapping で設定された生成列であるため、データロード中に例 1 の dict テーブルから値が自動的に取得されます。 + -- その後、この列は重複排除や JOIN クエリに直接使用できます。 + order_id_int BIGINT AS dict_mapping('dict', order_uuid) + ) + DUPLICATE KEY (id, order_uuid) + DISTRIBUTED BY HASH(id); + ``` + +2. `order_id_int` 列が `dict_mapping('dict', 'order_uuid')` として設定されたこのテーブルに模擬データを ロード する際、StarRocks は `dict` テーブル内のキーと値のマッピング関係に基づいて、`order_id_int` 列に値を自動的に ロード します。 + + ```SQL + MySQL [test]> INSERT INTO dest_table1(id, order_uuid, batch) VALUES (1, 'a1', 1), (2, 'a1', 1), (3, 'a3', 1), (4, 'a3', 1); + Query OK, 4 rows affected (0.05 sec) + {'label':'insert_e191b9e4-8a98-11ee-b29c-00163e03897d', 'status':'VISIBLE', 'txnId':'72'} + + MySQL [test]> SELECT * FROM dest_table1; + +------+------------+-------+--------------+ + | id | order_uuid | batch | order_id_int | + +------+------------+-------+--------------+ + | 1 | a1 | 1 | 1 | + | 4 | a3 | 1 | 3 | + | 2 | a1 | 1 | 1 | + | 3 | a3 | 1 | 3 | + +------+------------+-------+--------------+ + 4 rows in set (0.02 sec) + ``` + + この例における `dict_mapping` の使用は、[重複排除計算とジョインクエリ](../../../using_starrocks/query_acceleration_with_auto_increment.md) を高速化できます。正確な重複排除を高速化するために グローバル辞書 を構築する以前のソリューションと比較して、`dict_mapping` を使用するソリューションはより柔軟でユーザーフレンドリーです。なぜなら、マッピング値は「キーと値のマッピング関係をテーブルに ロード する」段階でディクショナリテーブルから直接取得されるからです。マッピング値を取得するためにディクショナリテーブルを ジョイン するステートメントを記述する必要はありません。さらに、このソリューションはさまざまな データロード方法 をサポートしています。 + +**例 3: テーブル内のマッピング列が 生成列 として設定されていない場合、テーブルにデータを ロード する際に、マッピング列に対して `dict_mapping` 関数を明示的に設定し、キーにマップされた値を取得する必要があります。** + +> **注意** +> +> 例 3 と例 2 の違いは、データテーブルにインポートする際に、インポートコマンドを修正して、マッピング列に対して `dict_mapping` 式を明示的に設定する必要があることです。 + +1. テーブルを作成します。 + + ```SQL + CREATE TABLE dest_table2 ( + id BIGINT, + order_uuid STRING, + order_id_int BIGINT NULL, + batch int comment 'used to distinguish different batch loading' + ) + DUPLICATE KEY (id, order_uuid, order_id_int) + DISTRIBUTED BY HASH(id); + ``` + +2. このテーブルに模擬データが ロード される際、`dict_mapping` を設定することでディクショナリテーブルからマッピングされた値を取得します。 + + ```SQL + MySQL [test]> INSERT INTO dest_table2 VALUES (1, 'a1', dict_mapping('dict', 'a1'), 1); + Query OK, 1 row affected (0.35 sec) + {'label':'insert_19872ab6-8a96-11ee-b29c-00163e03897d', 'status':'VISIBLE', 'txnId':'42'} + + MySQL [test]> SELECT * FROM dest_table2; + +------+------------+--------------+-------+ + | id | order_uuid | order_id_int | batch | + +------+------------+--------------+-------+ + | 1 | a1 | 1 | 1 | + +------+------------+--------------+-------+ + 1 row in set (0.02 sec) + ``` + +**例 4: null_if_not_exist モードを有効にする** + +`` モードが無効で、ディクショナリテーブルに存在しないキーにマップされた値がクエリされた場合、`NULL` ではなくエラーが返されます。これにより、データ行のキーが最初にディクショナリテーブルに ロード され、そのマッピングされた値 (ディクショナリ ID) が生成されてから、そのデータ行がターゲットテーブルに ロード されることが保証されます。 + +```SQL +MySQL [test]> SELECT dict_mapping('dict', 'b1', true); +ERROR 1064 (HY000): Query failed if record not exist in dict table. +``` + +**例 5: ディクショナリテーブルが複合主キーを使用する場合、クエリ時にはすべての主キーを指定する必要があります。** + +1. 複合主キーを持つディクショナリテーブルを作成し、模擬データを ロード します。 + + ```SQL + MySQL [test]> CREATE TABLE dict2 ( + order_uuid STRING, + order_date DATE, + order_id_int BIGINT AUTO_INCREMENT + ) + PRIMARY KEY (order_uuid,order_date) -- 複合主キー + DISTRIBUTED BY HASH (order_uuid,order_date) + ; + Query OK, 0 rows affected (0.02 sec) + + MySQL [test]> INSERT INTO dict2 VALUES ('a1','2023-11-22',default), ('a2','2023-11-22',default), ('a3','2023-11-22',default); + Query OK, 3 rows affected (0.12 sec) + {'label':'insert_9e60b0e4-89fa-11ee-a41f-b22a2c00f66b', 'status':'VISIBLE', 'txnId':'15029'} + + + MySQL [test]> select * from dict2; + +------------+------------+--------------+ + | order_uuid | order_date | order_id_int | + +------------+------------+--------------+ + | a1 | 2023-11-22 | 1 | + | a3 | 2023-11-22 | 3 | + | a2 | 2023-11-22 | 2 | + +------------+------------+--------------+ + 3 rows in set (0.01 sec) + ``` + +2. ディクショナリテーブルでキーにマップされた値をクエリします。ディクショナリテーブルには複合主キーがあるため、`dict_mapping` ですべての主キーを指定する必要があります。 + + ```SQL + SELECT dict_mapping('dict2', 'a1', cast('2023-11-22' as DATE)); + ``` + + 主キー が1つしか指定されていない場合、エラーが発生することに注意してください。 + + ```SQL + MySQL [test]> SELECT dict_mapping('dict2', 'a1'); + ERROR 1064 (HY000): Getting analyzing error. Detail message: dict_mapping function param size should be 3 - 5. + ``` diff --git a/docs/zh/sql-reference/sql-functions/dict-functions/dict_mapping.md b/docs/zh/sql-reference/sql-functions/dict-functions/dict_mapping.md index dbdf43b4..4388f185 100644 --- a/docs/zh/sql-reference/sql-functions/dict-functions/dict_mapping.md +++ b/docs/zh/sql-reference/sql-functions/dict-functions/dict_mapping.md @@ -1,14 +1,13 @@ ---- displayed_sidebar: docs --- -# `dict_mapping` +# dict_mapping -返回字典表中与指定键映射的值。 +将字典表中的指定键映射到值。 -此函数主要用于简化全局字典表的应用。在将数据加载到目标表期间,StarRocks 会通过使用此函数中的输入参数,自动从字典表中获取与指定键映射的值,然后将该值加载到目标表中。 +该函数主要用于简化全局字典表的应用。在数据导入目标表时,StarRocks 会使用该函数中的输入参数,自动从字典表中获取指定键映射到的值,然后将该值导入目标表。 -自 v3.2.5 起,StarRocks 支持此功能。另请注意,目前 StarRocks 的存算分离模式不支持此功能。 +StarRocks 自 v3.2.5 版本起支持该函数。另外请注意,StarRocks 当前的存算分离模式不支持该函数。 ## 语法 @@ -22,47 +21,44 @@ key_column_expr ::= | ## 参数 -- 必需参数: - - `[.]`:字典表的名称,需要是 Primary Key table。支持的数据类型为 VARCHAR。 - - `key_column_expr_list`:字典表中键列的表达式列表,包括一个或多个 `key_column_exprs`。`key_column_expr` 可以是字典表中键列的名称,也可以是特定的键或键表达式。 +- 必选参数: + - `[.]`: 字典表的名称,该表必须是主键表。支持的数据类型为 VARCHAR。 + - `key_column_expr_list`: 字典表中键列的表达式列表,包含一个或多个 `key_column_expr`。`key_column_expr` 可以是字典表中键列的名称,也可以是特定的键或键表达式。 - 此表达式列表需要包括字典表的所有 Primary Key 列,这意味着表达式的总数需要与字典表中 Primary Key 列的总数匹配。因此,当字典表使用组合主键时,此列表中的表达式需要按顺序与表结构中定义的 Primary Key 列相对应。此列表中的多个表达式用逗号 (`,`) 分隔。如果 `key_column_expr` 是特定的键或键表达式,则其类型必须与字典表中相应 Primary Key 列的类型匹配。 + 该表达式列表需要包含字典表的所有主键列,这意味着表达式的总数需要与字典表中的主键列总数匹配。因此,当字典表使用复合主键时,此列表中的表达式需要按顺序与表结构中定义的主键列对应。此列表中的多个表达式用逗号 (`,`) 分隔。如果 `key_column_expr` 是特定的键或键表达式,其类型必须与字典表中对应主键列的类型匹配。 - 可选参数: - - ``:值列的名称,也就是映射列。如果未指定值列,则默认值列是字典表的 AUTO_INCREMENT 列。值列也可以定义为字典表中的任何列,不包括自增列和主键。该列的数据类型没有限制。 - - ``(可选):如果键在字典表中不存在,是否返回 Null。有效值: - - `true`:如果键不存在,则返回 Null。 + - ``: 值列的名称,也是映射列。如果未指定值列,则默认值列为字典表的 AUTO_INCREMENT 列。值列也可以定义为字典表中除自增列和主键之外的任何列。该列的数据类型没有限制。 + - ``(可选):当字典表中不存在键时,是否返回。可选值: + - `true`:如果键不存在,则返回 NULL。 - `false`(默认):如果键不存在,则抛出异常。 ## 返回值 -返回的数据类型与值列的数据类型保持一致。如果值列是字典表的自增列,则返回的数据类型为 BIGINT。 +返回值的 数据类型 与值列的数据类型保持一致。如果值列是字典表的自增列,则返回值的 数据类型 为 BIGINT。 -但是,当未找到与指定键映射的值时,如果 `` 参数设置为 `true`,则返回 `NULL`。如果参数设置为 `false`(默认),则返回错误 `query failed if record not exist in dict table`。 +但是,当未找到指定键映射到的值时,如果将 `` 参数设置为 `true`,则返回 `NULL`。如果将参数设置为 `false`(默认),则返回错误 `query failed if record not exist in dict table`。 ## 示例 -**示例 1:直接查询字典表中与键映射的值。** +**示例 1:直接从字典表中查询键映射到的值。** -1. 创建一个字典表并加载模拟数据。 +1. 创建字典表并导入模拟数据。 ```SQL - CREATE TABLE dict ( + MySQL [test]> CREATE TABLE dict ( order_uuid STRING, - order_id_int BIGINT AUTO_INCREMENT + order_id_int BIGINT AUTO_INCREMENT ) PRIMARY KEY (order_uuid) DISTRIBUTED BY HASH (order_uuid); Query OK, 0 rows affected (0.02 sec) - INSERT INTO dict (order_uuid) VALUES ('a1'), ('a2'), ('a3'); + MySQL [test]> INSERT INTO dict (order_uuid) VALUES ('a1'), ('a2'), ('a3'); Query OK, 3 rows affected (0.12 sec) {'label':'insert_9e60b0e4-89fa-11ee-a41f-b22a2c00f66b', 'status':'VISIBLE', 'txnId':'15029'} - SELECT * FROM dict; - ``` - - ```sql + MySQL [test]> SELECT * FROM dict; +------------+--------------+ | order_uuid | order_id_int | +------------+--------------+ @@ -75,12 +71,12 @@ key_column_expr ::= | > **注意** > - > 目前,`INSERT INTO` 语句不支持部分更新。因此,请确保插入到 `dict` 的键列中的值不重复。否则,在字典表中多次插入相同的键列值会导致其在值列中映射的值发生更改。 + > 当前 `INSERT INTO` 语句不支持部分列更新。因此,请确保插入到 `dict` 键列中的值没有重复。否则,在字典表中多次插入相同的键列值会导致其在值列中映射的值发生更改。 -2. 查询字典表中与键 `a1` 映射的值。 +2. 查询字典表中键 `a1` 映射到的值。 ```SQL - SELECT dict_mapping('dict', 'a1'); + MySQL [test]> SELECT dict_mapping('dict', 'a1'); +----------------------------+ | dict_mapping('dict', 'a1') | +----------------------------+ @@ -89,33 +85,33 @@ key_column_expr ::= | 1 row in set (0.01 sec) ``` -**示例 2:表中的映射列配置为使用 `dict_mapping` 函数生成的列。因此,在将数据加载到此表时,StarRocks 可以自动获取与键映射的值。** +**示例 2:将表中的映射列配置为使用 `dict_mapping` 函数的生成列。这样,StarRocks 可以在 数据导入 到此表时自动获取键映射到的值。** -1. 创建一个数据表,并通过使用 `dict_mapping('dict', order_uuid)` 将映射列配置为生成列。 +1. 创建数据表,并将映射列配置为使用 `dict_mapping('dict', order_uuid)` 的生成列。 ```SQL CREATE TABLE dest_table1 ( id BIGINT, - -- 此列记录 STRING 类型的订单号,对应于示例 1 中 dict 表中的 order_uuid 列。 - order_uuid STRING, + -- This column records the STRING type order number, corresponding to the order_uuid column in the dict table in Example 1. + order_uuid STRING, batch int comment 'used to distinguish different batch loading', - -- 此列记录与 order_uuid 列映射的 BIGINT 类型的订单号。 - -- 因为此列是使用 dict_mapping 配置的生成列,所以此列中的值在数据加载期间会自动从示例 1 中的 dict 表中获取。 - -- 随后,此列可以直接用于去重和 JOIN 查询。 + -- This column records the BIGINT type order number which mapped with the order_uuid column. + -- Because this column is a generated column configured with dict_mapping, the values in this column are automatically obtained from the dict table in Example 1 during data loading. + -- Subsequently, this column can be directly used for deduplication and JOIN queries. order_id_int BIGINT AS dict_mapping('dict', order_uuid) ) DUPLICATE KEY (id, order_uuid) DISTRIBUTED BY HASH(id); ``` -2. 当将模拟数据加载到此表中时,其中 `order_id_int` 列配置为 `dict_mapping('dict', 'order_uuid')`,StarRocks 会根据 `dict` 表中键和值之间的映射关系自动将值加载到 `order_id_int` 列中。 +2. 当向此表导入模拟数据,且 `order_id_int` 列配置为 `dict_mapping('dict', 'order_uuid')` 时,StarRocks 会根据 `dict` 表中键与值之间的映射关系,自动将值导入到 `order_id_int` 列。 ```SQL - INSERT INTO dest_table1(id, order_uuid, batch) VALUES (1, 'a1', 1), (2, 'a1', 1), (3, 'a3', 1), (4, 'a3', 1); - Query OK, 4 rows affected (0.05 sec) + MySQL [test]> INSERT INTO dest_table1(id, order_uuid, batch) VALUES (1, 'a1', 1), (2, 'a1', 1), (3, 'a3', 1), (4, 'a3', 1); + Query OK, 4 rows affected (0.05 sec) {'label':'insert_e191b9e4-8a98-11ee-b29c-00163e03897d', 'status':'VISIBLE', 'txnId':'72'} - SELECT * FROM dest_table1; + MySQL [test]> SELECT * FROM dest_table1; +------+------------+-------+--------------+ | id | order_uuid | batch | order_id_int | +------+------------+-------+--------------+ @@ -127,15 +123,15 @@ key_column_expr ::= | 4 rows in set (0.02 sec) ``` - 在此示例中使用 `dict_mapping` 可以加速 [去重计算和 JOIN 查询](../../../using_starrocks/query_acceleration_with_auto_increment.md)。与之前构建全局字典以加速精确去重的解决方案相比,使用 `dict_mapping` 的解决方案更加灵活和用户友好。因为映射值是在“将键和值之间的映射关系加载到表”的阶段直接从字典表中获取的。您无需编写语句来连接字典表以获取映射值。此外,此解决方案支持各种数据导入方法。 + 此示例中 `dict_mapping` 的使用可以加速[去重计算和 JOIN 查询](../../../using_starrocks/query_acceleration_with_auto_increment.md)。与之前通过构建全局字典来加速精准去重的解决方案相比,使用 `dict_mapping` 的解决方案更灵活、更易用。因为在“将键和值之间的映射关系导入表中”的阶段,映射值是直接从字典表中获取的。您无需编写语句来 JOIN 字典表以获取映射值。此外,此解决方案支持各种数据导入方法。 -**示例 3:如果表中的映射列未配置为生成列,则在将数据加载到表时,您需要为映射列显式配置 `dict_mapping` 函数,以获取与键映射的值。** +**示例 3:如果表中的映射列未配置为生成列,则在导入数据到表时,需要为映射列显式配置 `dict_mapping` 函数,以获取键映射到的值。** > **注意** > -> 示例 3 和示例 2 之间的区别在于,在导入到数据表时,您需要修改导入命令,以便为映射列显式配置 `dict_mapping` 表达式。 +> 示例 3 和示例 2 的区别在于,向数据表导入数据时,您需要修改导入命令,为映射列显式配置 `dict_mapping` 表达式。 -1. 创建一个表。 +1. 创建表。 ```SQL CREATE TABLE dest_table2 ( @@ -148,14 +144,14 @@ key_column_expr ::= | DISTRIBUTED BY HASH(id); ``` -2. 当模拟数据加载到此表中时,您可以通过配置 `dict_mapping` 从字典表中获取映射的值。 +2. 当模拟数据导入到此表时,通过配置 `dict_mapping` 从字典表获取映射值。 ```SQL - INSERT INTO dest_table2 VALUES (1, 'a1', dict_mapping('dict', 'a1'), 1); + MySQL [test]> INSERT INTO dest_table2 VALUES (1, 'a1', dict_mapping('dict', 'a1'), 1); Query OK, 1 row affected (0.35 sec) {'label':'insert_19872ab6-8a96-11ee-b29c-00163e03897d', 'status':'VISIBLE', 'txnId':'42'} - SELECT * FROM dest_table2; + MySQL [test]> SELECT * FROM dest_table2; +------+------------+--------------+-------+ | id | order_uuid | order_id_int | batch | +------+------------+--------------+-------+ @@ -164,36 +160,36 @@ key_column_expr ::= | 1 row in set (0.02 sec) ``` -**示例 4:启用 null_if_not_exist 模式** +**示例 4:启用 `null_if_not_exist` 模式** -当 `` 模式被禁用,并且查询了字典表中不存在的键所映射的值时,将返回一个错误,而不是 `NULL`。它确保数据行的键首先被加载到字典表中,并且在将该数据行加载到目标表之前,会生成其映射的值(字典 ID)。 +当禁用 `` 模式时,如果查询字典表中不存在的键所映射的值,将返回错误而不是 `NULL`。这确保了数据行的键首先导入到字典表,并在数据行导入到目标表之前生成其映射值(字典 ID)。 ```SQL -SELECT dict_mapping('dict', 'b1', true); +MySQL [test]> SELECT dict_mapping('dict', 'b1', true); ERROR 1064 (HY000): Query failed if record not exist in dict table. ``` -**示例 5:如果字典表使用组合主键,则在查询时必须指定所有主键。** +**示例 5:如果字典表使用复合主键,则在查询时必须指定所有主键。** -1. 创建一个具有组合主键的字典表,并将模拟数据加载到其中。 +1. 创建具有复合主键的字典表并导入模拟数据。 ```SQL - CREATE TABLE dict2 ( + MySQL [test]> CREATE TABLE dict2 ( order_uuid STRING, - order_date DATE, + order_date DATE, order_id_int BIGINT AUTO_INCREMENT ) - PRIMARY KEY (order_uuid,order_date) -- 组合主键 + PRIMARY KEY (order_uuid,order_date) -- composite primary Key DISTRIBUTED BY HASH (order_uuid,order_date) ; Query OK, 0 rows affected (0.02 sec) - INSERT INTO dict2 VALUES ('a1','2023-11-22',default), ('a2','2023-11-22',default), ('a3','2023-11-22',default); + MySQL [test]> INSERT INTO dict2 VALUES ('a1','2023-11-22',default), ('a2','2023-11-22',default), ('a3','2023-11-22',default); Query OK, 3 rows affected (0.12 sec) {'label':'insert_9e60b0e4-89fa-11ee-a41f-b22a2c00f66b', 'status':'VISIBLE', 'txnId':'15029'} - select * from dict2; + MySQL [test]> select * from dict2; +------------+------------+--------------+ | order_uuid | order_date | order_id_int | +------------+------------+--------------+ @@ -204,15 +200,15 @@ ERROR 1064 (HY000): Query failed if record not exist in dict table. 3 rows in set (0.01 sec) ``` -2. 查询字典表中与键映射的值。由于字典表具有组合主键,因此需要在 `dict_mapping` 中指定所有主键。 +2. 查询字典表中键映射到的值。因为字典表具有复合主键,所以需要在 `dict_mapping` 中指定所有主键。 ```SQL SELECT dict_mapping('dict2', 'a1', cast('2023-11-22' as DATE)); ``` - 请注意,如果仅指定一个主键,则会发生错误。 + 请注意,当仅指定一个主键时,会发生错误。 ```SQL - SELECT dict_mapping('dict2', 'a1'); + MySQL [test]> SELECT dict_mapping('dict2', 'a1'); ERROR 1064 (HY000): Getting analyzing error. Detail message: dict_mapping function param size should be 3 - 5. ```