diff --git a/auto-random.md b/auto-random.md index 91206aba36ed..f067f1a5e7dc 100644 --- a/auto-random.md +++ b/auto-random.md @@ -160,30 +160,39 @@ SHOW WARNINGS; ## 清除自增 ID 缓存 -显式插入数据到 `AUTO_RANDOM` 列的行为与 `AUTO_INCREMENT` 列一致,你也需要清除自增 ID 缓存。详细信息请参阅[清除自增 ID 缓存](/auto-increment.md#清除自增-id-缓存)。 +在部署了多个 TiDB 实例的集群中,向 `AUTO_RANDOM` 列插入显式值时,可能会发生 ID 冲突,与 `AUTO_INCREMENT` 列类似。如果显式插入的 ID 值与 TiDB 用于自动生成的内部计数器冲突,可能会导致错误。 -你可以执行 `ALTER TABLE` 语句设置 `AUTO_RANDOM_BASE=0` 来清除集群中所有 TiDB 节点的自增 ID 缓存。例如: +冲突发生的原因如下:每个 `AUTO_RANDOM` ID 由随机位 (Random Bits) 和自增部分组成。TiDB 使用内部计数器来生成自增部分。如果显式插入的 ID 的自增部分恰好等于计数器的下一个值,则此后当 TiDB 尝试自动生成该相同 ID 时,可能会发生重复键错误。更多详细信息,请参阅 [`AUTO_INCREMENT` 唯一性保证](/auto-increment.md#唯一性保证)。 + +在单个 TiDB 实例中,该问题不会发生,因为节点在处理显式插入时会自动调整其内部计数器,从而防止冲突。相比之下,在有多个 TiDB 节点的环境中,每个节点维护自己的 ID 缓存,所以你需要清除这些缓存以防止显式插入后发生冲突。要清除这些未分配的缓存 ID 并避免潜在的冲突,有以下两种方法: + +### 方法 1:自动重置基值(推荐方式) ```sql ALTER TABLE t AUTO_RANDOM_BASE=0; ``` -``` -Query OK, 0 rows affected, 1 warning (0.52 sec) -``` +该语句会自动确定一个合适的基值。尽管执行后会返回类似于 `Can't reset AUTO_INCREMENT to 0 without FORCE option, using XXX instead` 的警告信息,但基值确实会被更新,因此你可以忽略此警告。 + +> **注意:** +> +> 不能使用 `FORCE` 关键字将 `AUTO_RANDOM_BASE` 设置为 `0`,否则会导致错误。 + +### 方法 2:手动设置特定的基值 + +如果需要设置一个特定的基值(例如 `1000`),可以使用 `FORCE` 关键字: ```sql -SHOW WARNINGS; +ALTER TABLE t FORCE AUTO_RANDOM_BASE = 1000; ``` -``` -+---------+------+-------------------------------------------------------------------------+ -| Level | Code | Message | -+---------+------+-------------------------------------------------------------------------+ -| Warning | 1105 | Can't reset AUTO_INCREMENT to 0 without FORCE option, using 101 instead | -+---------+------+-------------------------------------------------------------------------+ -1 row in set (0.00 sec) -``` +但是这种方法并不方便,因为你需要自行确定合适的基值。 + +> **注意:** +> +> 使用 `FORCE` 时,必须指定一个非零的正整数。 + +以上两个方法中的语句均会修改所有 TiDB 节点上生成 `AUTO_RANDOM` 值时使用的自增位起始值,但不会影响已经分配的 ID。 ## 使用限制