开发指南—Sequence—使用限制

本文涉及的产品
云原生数据库 PolarDB 分布式版,标准版 2核8GB
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: 本文将介绍使用Sequence过程中的注意事项及问题处理的方法。

限制与注意事项

在使用Sequence时,您需要注意如下事项:

  • 转换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:或者依赖于Sequence,或者依赖于后端RDS/MySQL表的自增列;应避免两种机制混用,否则很可能会造成id冲突(INSERT时产生重复id)的情况,且难于排查。
  • 将Time-based Sequence用于表中自增列时,该列必须使用BIGINT类型。

如何处理主键冲突

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

  1. 通过SHOW SEQUENCES来查看当前已有Sequence。AUTO_SEQ_ 开头的Sequence是隐式Sequence(创建表时加上AUTO_INCREMENT参数的字段产生的Sequence)。请在命令行输入如下代码:
mysql> SHOW SEQUENCES;
  1. 返回结果如下:
+---------------------+-------+--------------+------------+-----------+-------+-------+

| 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)
  1. 若xkv_t_item表有冲突,并且xkv_t_item表主键是ID,那么从PolarDB-X获取这个表最大主键值。请在命令行输入如下代码:
mysql> SELECT MAX(id) FROM xkv_t_item;
  1. 返回结果如下:
+-----------+ 
| MAX(id) |
+-----------+
| 8231 |
+-----------+
1 row in set (0.01 sec)
  1. 更新Sequence表中对应的值,这里更新成比8231要大的值,比如9000,更新完成后,后续插入语句生成的自增主键将不再报错。请在命令行输入如下代码:
mysql> ALTER SEQUENCE AUTO_SEQ_xkv_t_item START WITH 9000;
相关实践学习
跟我学:如何一键安装部署 PolarDB-X
《PolarDB-X 动手实践》系列第一期,体验如何一键安装部署 PolarDB-X。
相关文章
|
Linux
htop的安装和使用!
ubuntu: sudo apt-get install htop centos:     1、下载htop rpm包     wget http://pkgs.repoforge.org/htop/htop-1.
3078 0
|
关系型数据库 MySQL 数据库
开发指南—Sequence—使用限制
本文将介绍使用Sequence过程中的注意事项及问题处理的方法。
|
SQL 关系型数据库 MySQL
开发指南—Sequence—概述
本文将为您介绍Sequence的相关概念和支持的类型。
102 0
|
10月前
|
SQL 算法 安全
教你几招快速创建MySQL千万级数据,学习上百种优化技巧
如果你打算好好学习一下 MySQL,性能优化肯定是绕不过去一个问题。当你撸起袖子准备开始的时候,突然发现一个问题摆在眼前,本地数据库中没那么大的数据量啊,几条数据优化个毛线啊。生产库里数据多,但谁敢直接在生产环境动手啊,想被提前优化吗?
|
12月前
|
SQL Java 数据库连接
MyBatis-10MyBatis注解方式之Provider注解
MyBatis-10MyBatis注解方式之Provider注解
251 0
|
10月前
|
存储 XML 消息中间件
一文彻底搞懂序列化和反序列化
一文彻底搞懂序列化和反序列化
|
消息中间件 NoSQL JavaScript
用 Redis 实现延迟队列,我研究了两种方案,发现并不简单 下
用 Redis 实现延迟队列,我研究了两种方案,发现并不简单 下
|
Arthas Java 应用服务中间件
Jvm 相关命令之:dashboard | 学习笔记
快速学习 Jvm 相关命令之:dashboard
346 0
Jvm 相关命令之:dashboard | 学习笔记
|
Web App开发 前端开发 JavaScript
Spring MVC中文件上传和下载
文件上传需将表格的提交方式设为"POST",并且将enctype设为"multipart/form-data",以二进制的方式提交数据。 spring mvc中可通过MultipartResolver监听每个请求,如有上传的文件,则把请求封装为MultipartHttpServletRequest,通过封装的请求可以获取上传的文件信息和上传的文件。 实际使用可直接将MultipartFile作为控制器中请求处理方法的参数,MultipartFile是一个接口,其实现类为CommonsMultipartFile,通过MultipartFile封装的方法也可获取文件相关信息。
|
存储 NoSQL 安全
记一次阿里云esc实例被黑客利用redis默认端口6379入侵变成肉鸡的悲惨经历
网络安全无小事,任何的侥幸心理都不可有。对于redis的使用,尽量不要暴露在公网ip之下,并且不要使用默认端口,最好绑定可使用ip和设置密码等等