【 使用环境 】生产环境
【 使用版本 】商业版 3.2.3
【问题描述】我有一个订单表,id是主键(自增),order_no(订单号)是唯一键,我想创建分区表,因为平时都是按照order_no查询,所以我要用order_no作为分区键做 key 分区。
提系统提示:order_no必须是主键的一部分才可以。
如果这样的话,我就需要把 id 和 order_no一起做联合主键,这样就可以用order_no做key分区了。
问题是:id 和 order_no一起做联合主键,既不能保证id的唯一,也不能保证order_no的唯一。我还需要创建基于id做唯一索引,当然order_no本来还是延续原来的唯一索引。
这么做才能保证id和order_no都是唯一的。
我有个疑问,如果有主键,为何分区键必须包含在主键里面?我认为这么做没有什么意义,也想不通为什么。
就如我这个需求:id是主键,order_no是唯一索引,我直接用order_no做key分区就可以了啊。为何非要求把order_no加入主键字段里面,还要多创建一个id唯一索引。
1 个赞
id你做主键的时候能保证唯一,怎么联合就不能保证唯一了。
id的产生有很多分布式方案,保证唯一的,只是不一定是连续自增,单调递增肯定可以做到的。
分布式场景下单纯靠数据库保证唯一性?
1 个赞
分区表中的全局唯一性需求可以通过主键约束和唯一约束实现。OceanBase 数据库的分区表的主键约束和唯一键约束必须包含拆分键。唯一约束也是一个全局索引。全局唯一的需求也可以通过本地唯一索引实现,只需要在唯一索引里包含拆分键。
OceanBase 数据库的分区表的主键约束和唯一键约束必须包含拆分键。这句话不对吧
如果有主键,分区键必须包含在主键之中。这是我的疑问,为什么要这么规定?
那是官方关于分区表的描述,并不是我自己随便写的。
3.2.3版本说明见官方文档
https://www.oceanbase.com/docs/enterprise-oceanbase-database-cn-10000000000357627
看看上边那句话,已经说的很清楚了啊