限制与注意事项
- 转换 Sequence 类型时,必须指定 START WITH 起始值;
- 单元化 Group Sequence 不支持作为源或目标的类型转换,也不支持起始值以外的参数修改;
- 属于同一个全局唯一数字序列分配空间的每个单元化 Group Sequence,必须指定相同的单元数量和不同的单元索引;
- 在 PolarDB-X 非拆分模式库(即后端仅关联一个已有的 RDS 物理库)、或拆分模式库中仅有单表(即所有表都是单库单表,且无广播表)的场景下执行 INSERT 时, PolarDB-X 会自动优化并直接下推语句,绕过优化器中分配 Sequence 值的部分。此时
INSERT INTO ... VALUES (seq.nextval, ...)
这种用法不支持,建议使用后端 RDS/MySQL 自增列机制代替。 - 如果将指定分库的 Hint 用在 INSERT 语句上,比如 INSERT INTO … VALUES … 或 INSERT INTO … SELECT …,且目标表使用了 Sequence,则 PolarDB-X 会绕过优化器直接下推语句,使 Sequence 不生效,目标表最终会使用后端 RDS/MySQL 表中的自增机制生成ID。
- 必须对同一个表采用一种统一的方式分配自增ID:或者依赖于 PolarDB-X Sequence,或者依赖于后端 RDS/MySQL 表的自增列;应避免两种机制混用,否则很可能会造成ID冲突(INSERT 时产生重复ID)的情况,且难于排查。
- 将 Time-based Sequence 用于表中自增列时,该列必须使用 BIGINT 类型;
如何处理主键冲突
比如直接在 RDS 中写入了数据,而对应的主键值不是 PolarDB-X 生成的 Sequence 值,那么后续让 PolarDB-X 自动生成主键写入数据库,可能会和这些数据发生主键冲突,可以通过以下步骤解决问题:
- 通过
SHOW SEQUENCES
来查看当前已有 Sequence。AUTO_SEQ_ 开头的 Sequence 是隐式 Sequence(创建表时加上 AUTO_INCREMENT 参数的字段产生的 Sequence):
mysql> 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 inset(0.04 sec)
- 比如 xkv_t_item 表有冲突,并且 xkv_t_item 表主键是 ID,那么从 PolarDB-X 获取这个表最大主键值:
mysql> SELECT MAX(id) FROM xkv_t_item;
+-----------+
| MAX(id) |
+-----------+
|8231 |
+-----------+
1 row inset(0.01 sec)
- 更新 PolarDB-X Sequence 表中对应的值,这里更新成比 8231 要大的值,比如 9000,更新完成后,后续插入语句生成的自增主键将不再报错:
mysql> ALTER SEQUENCE AUTO_SEQ_xkv_t_item START WITH 9000;
Query OK,1 row affected (0.01 sec)