Skip to content

Commit 0f5d7e2

Browse files
authored
tidb-functions: clarify TIDB_ENCODE_INDEX_KEY parameters (#21278) (#21288)
1 parent 335678b commit 0f5d7e2

File tree

1 file changed

+55
-7
lines changed

1 file changed

+55
-7
lines changed

functions-and-operators/tidb-functions.md

Lines changed: 55 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -554,7 +554,45 @@ SELECT VITESS_HASH(123);
554554
555555
## TIDB_ENCODE_INDEX_KEY
556556
557-
对索引键进行编码。
557+
`TIDB_ENCODE_INDEX_KEY()` 函数将指定的索引键编码为一个十六进制字符串。函数语法如下:
558+
559+
```sql
560+
TIDB_ENCODE_INDEX_KEY(<db_name>, <table_name>, <index_name>, <index_columns>..., <handle_columns>...)
561+
```
562+
563+
参数说明:
564+
565+
* `<db_name>`:目标索引所在的数据库的名称。
566+
* `<table_name>`:目标索引所在的表的名称。对于分区表,可以指定分区名,例如 `'t(p0)'`
567+
* `<index_name>`:目标索引的名称。
568+
* `<index_columns>...`:索引列的值。你必须按照索引定义的顺序依次指定。对于复合索引,需指定所有索引列的值。
569+
* `<handle_columns>...`:该行数据对应的 handle 值。根据表的主键类型不同,handle 值的取值规则如下:
570+
571+
* 如果表没有主键,或主键为 `NONCLUSTERED`,handle 值为隐藏列 `_tidb_rowid` 的值。
572+
* 如果表的主键为 `CLUSTERED` 且为单列整型,handle 值为主键列的值。
573+
* 如果表的主键为 `CLUSTERED` 且为复合主键或非整型 (common handle),handle 值由所有主键列的值按顺序组成。
574+
575+
以下示例展示了在不同主键类型下,如何为复合二级索引 `idx(c1, c2)` 调用此函数。
576+
577+
```sql
578+
-- 对于没有主键或主键为 NONCLUSTERED 的表,使用 _tidb_rowid
579+
SELECT TIDB_ENCODE_INDEX_KEY(
580+
'<db_name>', '<table_name>', '<index_name>',
581+
<c1>, <c2>, <_tidb_rowid>
582+
);
583+
584+
-- 对于主键为 CLUSTERED 的整型主键表(主键列为 id)
585+
SELECT TIDB_ENCODE_INDEX_KEY(
586+
'<db_name>', '<table_name>', '<index_name>',
587+
<c1>, <c2>, <id>
588+
);
589+
590+
-- 对于主键为 CLUSTERED 的复合主键表(主键列为 p1, p2)
591+
SELECT TIDB_ENCODE_INDEX_KEY(
592+
'<db_name>', '<table_name>', '<index_name>',
593+
<c1>, <c2>, <p1>, <p2>
594+
);
595+
```
558596

559597
```sql
560598
CREATE TABLE t(id int PRIMARY KEY, a int, KEY `idx` (a));
@@ -565,29 +603,39 @@ Query OK, 0 rows affected (0.00 sec)
565603
```
566604

567605
```sql
568-
INSERT INTO t VALUES(1,1);
606+
INSERT INTO t VALUES(1,2);
569607
```
570608

571609
```
572610
Query OK, 1 row affected (0.00 sec)
573611
```
574612

575613
```sql
576-
SELECT TIDB_ENCODE_INDEX_KEY('test', 't', 'idx', 1, 1);
614+
SELECT TIDB_ENCODE_INDEX_KEY('test', 't', 'idx', 2, 1);
577615
```
578616

579617
```
580618
+----------------------------------------------------------------------------+
581-
| TIDB_ENCODE_INDEX_KEY('test', 't', 'idx', 1, 1) |
619+
| TIDB_ENCODE_INDEX_KEY('test', 't', 'idx', 2, 1) |
582620
+----------------------------------------------------------------------------+
583-
| 74800000000000007f5f698000000000000001038000000000000001038000000000000001 |
621+
| 7480000000000000b45f698000000000000001038000000000000002038000000000000001 |
584622
+----------------------------------------------------------------------------+
585623
1 row in set (0.00 sec)
586624
```
587625

588626
## TIDB_ENCODE_RECORD_KEY
589627

590-
对记录键进行编码。
628+
`TIDB_ENCODE_RECORD_KEY()` 函数将指定的行记录键编码为一个十六进制字符串。函数语法如下:
629+
630+
```sql
631+
TIDB_ENCODE_RECORD_KEY(<db_name>, <table_name>, <handle_columns>...)
632+
```
633+
634+
参数说明:
635+
636+
* `<db_name>`:目标表所在的数据库的名称。
637+
* `<table_name>`:目标表所在的表的名称。对于分区表,可以在 `<table_name>` 中指定分区名,例如 `'t(p0)'`
638+
* `<handle_columns>...`:该行的 handle(行键)值。handle 的具体组成取决于表的主键类型,例如是否为 `CLUSTERED`、是否为 common handle、是否使用隐藏列 `_tidb_rowid`。详情请参考 [`TIDB_ENCODE_INDEX_KEY()`](#tidb_encode_index_key)`<handle_columns>...` 的说明。
591639

592640
```sql
593641
CREATE TABLE t(id int PRIMARY KEY, a int, KEY `idx` (a));
@@ -598,7 +646,7 @@ Query OK, 0 rows affected (0.00 sec)
598646
```
599647

600648
```sql
601-
INSERT INTO t VALUES(1,1);
649+
INSERT INTO t VALUES(1,2);
602650
```
603651

604652
```

0 commit comments

Comments
 (0)