本文将介绍自增列的限制与注意事项,以及处理主键冲突的方法。
限制与注意事项
- 在AUTO模式数据库中,仅支持关联New Sequence;
- 在DRDS模式库中,单表默认不关联Sequence,除非显式指定类型;
- 新创建的表不包含主键时,PolarDB-X会自动通过
AUTO_INCREMENT
关键字创建隐式主键,并关联Group Sequence; - 当自增列关联的Sequence类型为TIME时,该列类型必须为BIGINT;
- 如果
INSERT
语句中包含指定分库的Hint,例如INSERT INTO ... VALUES ...
或INSERT INTO ... SELECT ...
,并且目标表带有自增列,则PolarDB-X会绕过优化器直接下推语句,使与自增列关联的Sequence不生效,目标表最终会通过数据节点物理分表上的自增列属性填充值; - 支持通过
ALTER SEQUENCE
来添加、删除自增列或变更自增列的值; - PolarDB-X中Sequence暂不支持自定义步长,因此auto_increment_increment始终为1,而auto_increment_offset则不支持;
- New Sequence中使用GMS对AUTO_INCREMENT的值进行分配,为保证性能,需要在GMS内缓存一段值。如果GMS发生版本升级、主备切换、变配、迁移等操作,那么操作前内存中缓存的值会被丢弃,造成值的跳跃。
如何处理主键冲突
如果因为一些特殊场景导致了主键冲突,例如通过Hint下推导致物理分片分配ID后,Sequence无法感知到而分配了冲突的ID,您可以通过如下步骤解决此问题:
- 通过
SHOW SEQUENCES
来查看当前已有Sequence。AUTO_SEQ_ 开头的Sequence是隐式Sequence(创建表时通过AUTO_INCREMENT关键字产生的Sequence)。SHOW SEQUENCES;
返回结果如下:
+---------------------+-------+--------------+------------+-----------+-------+-------+ | NAME | VALUE | INCREMENT_BY | START_WITH | MAX_VALUE | CYCLE | TYPE | +---------------------+-------+--------------+------------+-----------+-------+-------+ | AUTO_SEQ_xkv_t_item | 0 | N/A | N/A | N/A | N/A | GROUP | | AUTO_SEQ_xkv_shard | 0 | N/A | N/A | N/A | N/A | GROUP | +---------------------+-------+--------------+------------+-----------+-------+-------+ 2 rows in set (0.04 sec)
- 若xkv_t_item表有冲突,并且xkv_t_item表主键是ID,那么从PolarDB-X获取这个表最大主键值。
SELECT MAX(id) FROM xkv_t_item;
返回结果如下:
+-----------+ | MAX(id) | +-----------+ | 8231 | +-----------+ 1 row in set (0.01 sec)
- 更新Sequence表中对应的值,这里更新成比8231要大的值,例如9000,更新完成后,后续插入语句生成的自增主键将不再报错。
ALTER SEQUENCE AUTO_SEQ_xkv_t_item START WITH 9000;