分区键必须是主键或唯一键的子集?

【 使用环境 】 测试环境
【 OB or 其他组件 】ob-oracle模式
【 使用版本 】3.2.4
【问题描述】OceanBase数据库文档中定义“分区键必须是主键或唯一键的子集”, 这个限制下,下面oracle的建表有主键但不是分区键,那到Ob上应该如何改写? 难道我只能废除原来的主键吗
CREATE TABLE CUSTOMER
(
CUSTOMER_ID NUMBER NOT NULL PRIMARY KEY,
FIRST_NAME VARCHAR2(30) NOT NULL,
LAST_NAME VARCHAR2(30) NOT NULL,
PHONEVARCHAR2(15) NOT NULL,
EMAILVARCHAR2(80),
STATUS CHAR(1),
joindate date
)
PARTITION BY RANGE (joindate)
(
partition p_before_2020 values less than (to_date(‘2021-01-01’,‘YYYY-MM-DD’)),
partition p_before_2021 values less than (to_date(‘2022-01-01’,‘YYYY-MM-DD’))
)
;

你的建表信息不完整吧?

只是举例 ,不是直正的建表语句。 目的针对这个限制找解决方案

由于oceanbase是分布式数据库,为了更高效的根据分区键查找数据的位置,所以要求分区键必须是主键或者唯一索引的一部分。可以把 joindate 跟其他字段放在一起做一个唯一索引?

PRIMARY KEY(“CUSTOMER_ID”,“joindate”)把分区键也加入主键中

创建联合主键,最近用tbase头大,本来业务主键一个或者两个,加上分片键加上分区键,瞬间主键大好几倍

加上字段做联合主键 原主键本来唯一 这样就可能变成不唯一了

主键再加上任何东西,都还是唯一的吧

对于业务来说是不唯一了,但是对于分布式的数据库来说是全局唯一了,以前还因为这个扯皮过,以我的想法就是假唯一 :smile:

对应用层面来说,有可能不唯一了,举例:
##PK列是ID时,ID的值始终是唯一
ID name
1 a
2 a
3 b

##PK列联合主键(ID,name)时:
ID name
1 a
1 b <------ 此时ID列不能保证唯一了
2 a
3 b

所以是个假唯一,只是为了保证数据库层面的全局唯一,主要看业务能不能接受

OB的主键就是表(包括分区和非分区),如果是分区表,主键按分区键进行分区,你可以这么理解“分区键是表(主键)的子集”,如果一定要符合Oracle的主键定义,你可以创建二级索引(单列CUSTOMER_ID),设置为非空,索引是全局。

这样就涉及到维护表的分区操作时,需要加上update global index

1 个赞