全部产品
弹性计算 会员服务 网络 安全 移动云 数加·大数据分析及展现 数加·大数据应用 管理与监控 云通信 阿里云办公 培训与认证 更多
存储与CDN 数据库 域名与网站(万网) 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 智能硬件
分布式关系型数据库 DRDS

Sequence 限制及注意事项

更新时间:2018-03-12 18:55:26

限制与注意事项

  • 转换 Sequence 类型时,必须指定 START WITH 起始值;
  • 在 DRDS 非拆分模式库(即后端仅关联一个已有的 RDS 物理库)、或拆分模式库中仅有单表(即所有表都是单库单表,且无广播表)的场景下执行 INSERT 时, DRDS 会自动优化并直接下推语句,绕过优化器中分配 Sequence 值的部分。此时 INSERT INTO ... VALUES (seq.nextval, ...)这种用法不支持,建议使用后端 RDS/MySQL 自增列机制代替。
  • 如果将指定分库的 Hint 用在 INSERT 语句上,比如 INSERT INTO … VALUES … 或 INSERT INTO … SELECT …,且目标表使用了 Sequence,则 DRDS 会绕过优化器直接下推语句,使 Sequence 不生效。目标表最终会使用后端 RDS/MySQL 表中的自增机制生成 id。
  • 必须对同一个表采用一种统一的方式分配自增 id:或者依赖于 DRDS Sequence,或者依赖于后端 RDS/MySQL 表的自增列。避免两种机制混用,否则可能会造成 id 冲突(产生重复 id)的情况,且难于排查。

如何处理主键冲突

比如直接在 RDS 中写入了数据,而对应的主键值不是 DRDS 生成的 Sequence 值,那么后续让 DRDS 自动生成主键写入数据库,可能会和这些数据发生主键冲突,可以通过以下步骤解决问题:

  1. 通过 DRDS 指定 SQL 来查看当前已有 Sequence。AUTO_SEQ_ 开头的 Sequence 是隐式 Sequence(创建表时加上 AUTO_INCREMENT 参数的表产生的 Sequence):

    1. mysql> SHOW SEQUENCES;
    2. +---------------------+-------+--------------+------------+-----------+-------+-------+
    3. | NAME | VALUE | INCREMENT_BY | START_WITH | MAX_VALUE | CYCLE | TYPE |
    4. +---------------------+-------+--------------+------------+-----------+-------+-------+
    5. | AUTO_SEQ_xkv_t_item | 0 | N/A | N/A | N/A | N/A | GROUP |
    6. | AUTO_SEQ_xkv_shard | 0 | N/A | N/A | N/A | N/A | GROUP |
    7. +---------------------+-------+--------------+------------+-----------+-------+-------+
    8. 2 rows in set (0.04 sec)
  2. 比如 xkv_t_item 表有冲突,并且 xkv_t_item 表主键是 ID,那么从 DRDS 获取这个表最大主键值:

    1. mysql> SELECT MAX(id) FROM xkv_t_item;
    2. +-----------+
    3. | max(id) |
    4. +-----------+
    5. | 8231 |
    6. +-----------+
    7. 1 row in set (0.01 sec)
  3. 更新 DRDS Sequence 表中对应的值,这里更新成比 8231 要大的值,比如 9000,更新完成后,后续插入语句生成的自增主键将不再报错:

    1. mysql> ALTER SEQUENCE AUTO_SEQ_xkv_t_item START WITH 9000;
    2. Query OK, 1 row affected (0.01 sec)
本文导读目录