开发指南—Sequence—使用限制

本文涉及的产品
云原生数据库 PolarDB 分布式版,标准版 2核8GB
简介: 本文将介绍使用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开源数据库
本实验环境已内置PostgreSQL数据库以及PolarDB开源数据库:PolarDB PostgreSQL版和PolarDB分布式版,支持一键拉起使用,方便各位开发者学习使用。
相关文章
|
11月前
|
存储 Prometheus Kubernetes
K8s + prometheus + vm(VictoriaMetrics)
K8s + prometheus + vm(VictoriaMetrics)
369 1
|
关系型数据库 MySQL 数据库
Docker容器数据持久化之Data Volume(数据卷)与容器数据共享(1)
Docker容器数据持久化之Data Volume(数据卷)与容器数据共享(1)
173 0
|
关系型数据库 MySQL 数据库
开发指南—Sequence—使用限制
本文将介绍使用Sequence过程中的注意事项及问题处理的方法。
103 0
|
SQL 关系型数据库 MySQL
开发指南—Sequence—概述
本文将为您介绍Sequence的相关概念和支持的类型。
126 0
|
Ubuntu 安全 Linux
su,su -,su - root,sudo,sudo -i,sudo su - 有何不同,在ubuntu和centos上用法有什么异同?
sudo -i命令:在Ubuntu和CentOS中,sudo -i命令可以启动一个新的shell会话,并将环境变量设置为root用户的环境变量。在使用该命令时同样需要输入当前用户的密码进行身份验证。
219 0
|
Kubernetes Java 调度
SpringCloud-全面详解(学习总结---从入门到深化)
在互联网发展的初期,用户数量少,一般网站的流量也很少,但硬 件成本较高。
911 0
SpringCloud-全面详解(学习总结---从入门到深化)
|
网络协议 安全 Linux
iptables的原理和使用样例
iptables是Linux系统中用于配置和管理网络包过滤规则的工具。它可以用于设置防火墙、网络地址转换(NAT)以及网络包的源地址、目标地址和端口的过滤等功能。以下是一些iptables的用法示例: 1. 允许特定IP地址的入站连接: ``` iptables -A INPUT -s 192.168.0.1 -j ACCEPT ``` 这条规则将允许来自IP地址为192.168.0.1的主机的所有入站连接。 2. 允许特定端口的入站连接: ``` iptables -A INPUT -p tcp --dport 22 -j ACCEPT ``` 这条规则将允许所有TCP协议的目标端口为2
212 2
|
消息中间件 存储 监控
超详细:这份全网首发的Kafka技术手册,从基础到实战一应俱全
Kafka正在爆炸式增长。超过三分之一的财富500强企业都使用Kafka。这些公司包括十大旅游公司,十大银行中的七家,十大保险公司中的八家,十大电信公司中的九家,以及更多。LinkedIn,微软和Netflix每天使用Kafka(1,000,000,000,000)处理万亿级的消息。Kafka用于实时数据流,收集大数据或进行实时分析(或两者兼而有之)。Kafka与内存微服务一起使用以提供可靠性,它可用于向 CEP(复杂事件流系统)和IoT / IFTTT式自动化系统提供事件。
|
消息中间件 Kubernetes Java
「集成架构」我们得谈谈 Apache Camel
「集成架构」我们得谈谈 Apache Camel
|
机器学习/深度学习 Linux
Linux下安装gmp6.2.1的详细操作(深度学习)
Linux下安装gmp6.2.1的详细操作(深度学习)
590 0
Linux下安装gmp6.2.1的详细操作(深度学习)