Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion auto-random.md
Original file line number Diff line number Diff line change
Expand Up @@ -114,8 +114,9 @@ TiDB 自动分配的 `AUTO_RANDOM(S, R)` 列值共有 64 位:
|-------------|--------|------------|
| `64-R` bits | `S` bits | `R-S` bits |

- 是否有符号位取决于该列是否存在 `UNSIGNED` 属性。
- 是否有符号位取决于该列是否存在 `UNSIGNED` 属性。`AUTO_RANDOM` 列隐式分配的值始终为正数;对于有符号列,其符号位始终为 `0`,无符号列没有符号位。显式插入的值不适用该隐式分配规则。

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

补充负 AUTO_RANDOM_BASE 的例外。

当前“始终为正数”和“符号位始终为 0”是绝对表述。对于有符号列,应明确说明:默认隐式分配值为正数;指定负的 AUTO_RANDOM_BASE 后可以生成负数。否则用户可能错误判断生成的负值。

可提交的修改
Suggested change
- 是否有符号位取决于该列是否存在 `UNSIGNED` 属性。`AUTO_RANDOM` 列隐式分配的值始终为正数;对于有符号列,其符号位始终为 `0`无符号列没有符号位。显式插入的值不适用该隐式分配规则。
- 是否有符号位取决于该列是否存在 `UNSIGNED` 属性。对于有符号列,`AUTO_RANDOM` 隐式分配的值默认始终为正数,且符号位始终为 `0`;如果指定了负的 `AUTO_RANDOM_BASE`,则可以生成负数。无符号列没有符号位。显式插入的值不适用该隐式分配规则。

As per path instructions:该修复可以安全应用于当前连续变更行,因此使用可提交建议块。

Source: Path instructions

- 保留位的长度为 `64-R`,保留位的内容始终为 `0`。
- 自增位至少为 27 位。对于有符号列,必须满足 `R-1-S >= 27`;对于无符号列,必须满足 `R-S >= 27`。
- 分片位的内容通过计算当前事务的开始时间的哈希值而得。要使用不同的分片位数量(例如 10),可以在建表时指定 `AUTO_RANDOM(10)`。
- 自增位的值保存在存储引擎中,按顺序分配,每次分配完值后会自增 1。自增位保证了 `AUTO_RANDOM` 列值全局唯一。当自增位耗尽后,再次自动分配时会报 `Failed to read auto-increment value from storage engine` 的错误。
- 关于取值范围:最终生成值包含的最大位数 = 分片位 + 自增位。有符号位的列的取值范围是 `[-(2^(R-1))+1, (2^(R-1))-1]`。无符号位的列的取值范围是 `[0, (2^R)-1]`。
Expand Down
Loading