Skip to content

Commit

Permalink
reference/sql: add some details to the document of auto_random (#2478)
Browse files Browse the repository at this point in the history
  • Loading branch information
tangenta authored Mar 18, 2020
1 parent 6066c73 commit 4a45770
Showing 1 changed file with 46 additions and 4 deletions.
50 changes: 46 additions & 4 deletions reference/sql/attributes/auto-random.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,12 +45,12 @@ create table t (a int auto_random, b varchar(255), primary key (a))

此时再执行形如 `INSERT INTO t(b) values...``INSERT` 语句。

+ 如果该 `INSERT` 语句没有指定整型主键列(`a` 列)的值,TiDB 会为该列自动分配值。该值不保证自增,不保证连续,只保证唯一,避免了连续的行 ID 带来的热点问题。
+ 如果该 `INSERT` 语句显式指定了整型主键列的值,和 `AUTO_INCREMENT` 属性类似,TiDB 会保存该值。
+ 如果该 `INSERT` 语句没有指定整型主键列(`a` 列)的值,或者指定为 `NULL`TiDB 会为该列自动分配值。该值不保证自增,不保证连续,只保证唯一,避免了连续的行 ID 带来的热点问题。
+ 如果该 `INSERT` 语句显式指定了整型主键列的值,和 `AUTO_INCREMENT` 属性类似,TiDB 会保存该值。注意,如果未在系统变量 `@@sql_mode` 中设置 `NO_AUTO_VALUE_ON_ZERO`, 即使显式指定整型主键列的值为 `0`,TiDB 也会为该列自动分配值。

自动分配值的计算方式如下:

该行值在二进制形式下的最高五位(称为 shard bits)由当前事务的开始时间决定,剩下的位数按照自增顺序分配数值
该行值在二进制形式下,除去最高位(无论是 unsigned 还是 signed)的次高五位(称为 shard bits)由当前事务的开始时间决定,剩下的位数按照自增的顺序分配

若要使用一个不同的 shard bits 的数量,可以在 `AUTO_RANDOM` 后面加一对括号,并在括号中指定想要的 shard bits 数量。示例如下:

Expand All @@ -62,7 +62,49 @@ create table t (a int primary key auto_random(3), b varchar(255))

以上建表语句中,shard bits 的数量为 `3`。shard bits 的数量的取值范围是 `[1, field_max_bits)`,其中 `field_max_bits` 为整型主键列类型占用的位长度。

含有 `AUTO_RANDOM` 属性的表在系统表 `information_schema.tables``TIDB_ROW_ID_SHARDING_INFO` 一列的值为 `PK_AUTO_RANDOM_BITS=x`,其中 `x` 为 shard bits 的数量。
创建完表后,使用 `SHOW WARNINGS` 可以查看当前表可支持的最大隐式分配的次数:

{{< copyable "sql" >}}

```sql
show warnings
```

```
+-------+------+------------------------------------------------+
| Level | Code | Message |
+-------+------+------------------------------------------------+
| Note | 1105 | Available implicit allocation times: 268435455 |
+-------+------+------------------------------------------------+
```

另外,含有 `AUTO_RANDOM` 属性的表在系统表 `information_schema.tables``TIDB_ROW_ID_SHARDING_INFO` 一列的值为 `PK_AUTO_RANDOM_BITS=x`,其中 `x` 为 shard bits 的数量。

要获取上一次 TiDB 隐式分配的 ID,可以使用 `select last_insert_id()` 查看,例如:

{{< copyable "sql" >}}

```sql
insert into t (b) values ("b")
select * from t;
select last_insert_id()
```

可能得到的结果如下:

```
+------------+---+
| a | b |
+------------+---+
| 1073741825 | b |
+------------+---+
+------------------+
| last_insert_id() |
+------------------+
| 1073741825 |
+------------------+
```

## 兼容性

Expand Down

0 comments on commit 4a45770

Please sign in to comment.