本文将介绍自增列的限制与注意事项,以及处理主键冲突的方法。

限制与注意事项

  • 在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,您可以通过如下步骤解决此问题:

  1. 通过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)
  2. 若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)
  3. 更新Sequence表中对应的值,这里更新成比8231要大的值,例如9000,更新完成后,后续插入语句生成的自增主键将不再报错。
    ALTER SEQUENCE AUTO_SEQ_xkv_t_item START WITH 9000;