diff --git a/auto-increment.md b/auto-increment.md index 37fc43cc6bcc..97e0d426c681 100644 --- a/auto-increment.md +++ b/auto-increment.md @@ -410,6 +410,47 @@ CREATE TABLE t(a int AUTO_INCREMENT key) AUTO_ID_CACHE 1; 使用 MySQL 兼容模式后,能保证 ID **唯一**、**单调递增**,行为几乎跟 MySQL 完全一致。即使跨 TiDB 实例访问,ID 也不会出现回退。只有在中心化分配自增 ID 服务的“主” TiDB 实例进程退出(如该 TiDB 节点重启)或者异常崩溃时,才有可能造成部分 ID 不连续。这是因为主备切换时,“备” 节点需要丢弃一部分之前的“主” 节点已经分配的 ID,以保证 ID 不出现重复。 +## 手动调整初始值 + +在显式插入自增值时,如果该值大于下一个要分配的自增值,当前 TiDB server 的初始值会自动增长,以保证后续隐式插入不会与该值重复。例如: + +```sql +CREATE TABLE t(id int PRIMARY KEY AUTO_INCREMENT, c int); +Query OK, 0 rows affected (0.53 sec) + +INSERT INTO t(id, c) VALUES(100000, 1); +Query OK, 1 row affected (0.02 sec) + +SHOW CREATE TABLE t; ++-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| Table | Create Table | ++-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| t | CREATE TABLE `t` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `c` int(11) DEFAULT NULL, + PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */ +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=130001 | ++-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +1 row in set (0.00 sec) +``` + +但是其他 TiDB server 的缓存范围不变,仍有可能出现 `Duplicate Entry` 的错误。所以在再次隐式分配前,需要手动调整初始值。你只需将 `AUTO_INCREMENT` 设置为 0,TiDB 会自动设置初始值为下一个可用范围的初始值。例如: + +```sql +ALTER TABLE t AUTO_INCREMENT=0; +Query OK, 0 rows affected, 1 warning (0.53 sec) + +SHOW WARNINGS; ++---------+------+----------------------------------------------------------------------------+ +| Level | Code | Message | ++---------+------+----------------------------------------------------------------------------+ +| Warning | 1105 | Can't reset AUTO_INCREMENT to 0 without FORCE option, using 130001 instead | ++---------+------+----------------------------------------------------------------------------+ +1 row in set (0.00 sec) +``` + +BR、DM、Lightning 在恢复或同步完数据之后,会自动调整 `AUTO_INCREMENT` 值。但 TiCDC 在同步数据之后不会自动调整,因此需要在停止 TiCDC 之后、进行主备切换之前,手动调整下游集群中表的 `AUTO_INCREMENT`。 + ## 使用限制 目前在 TiDB 中使用 `AUTO_INCREMENT` 有以下限制: diff --git a/auto-random.md b/auto-random.md index 034e06e41c80..d54e07dfdb1d 100644 --- a/auto-random.md +++ b/auto-random.md @@ -159,6 +159,25 @@ SHOW WARNINGS; `AUTO_RANDOM` 列隐式分配的值和自增列类似,也遵循 session 变量 [`auto_increment_increment`](/system-variables.md#auto_increment_increment) 和 [`auto_increment_offset`](/system-variables.md#auto_increment_offset) 的控制,其中隐式分配值的自增位 (ID) 满足等式 `(ID - auto_increment_offset) % auto_increment_increment == 0`。 +## 手动调整初始值 + +显式插入 `AUTO_RANDOM` 列的行为与 `AUTO_INCREMENT` 列一致,你也需要手动调整初始值,详细信息请参阅[手动调整初始值](/auto-increment.md#手动调整初始值)。 + +调整初始值时,需要设置表的 `AUTO_RANDOM_BASE` 值: + +```sql +ALTER TABLE t AUTO_RANDOM_BASE=0; +Query OK, 0 rows affected, 1 warning (0.52 sec) + +SHOW WARNINGS; ++---------+------+-----------------------------------------------------------------------+ +| Level | Code | Message | ++---------+------+-----------------------------------------------------------------------+ +| Warning | 1105 | Can't reset AUTO_INCREMENT to 0 without FORCE option, using 1 instead | ++---------+------+-----------------------------------------------------------------------+ +1 row in set (0.00 sec) +``` + ## 使用限制 目前在 TiDB 中使用 `AUTO_RANDOM` 有以下限制: