首页 > 解决方案 > Oracle:在非引用表上按引用创建分区(partition by reference(fk))

问题描述

我们已经意识到我们需要使用 Oracle (12 c) 间隔分区。我们有一个分层实体模型,其中包含很多 @OneToMany 关系。我们希望在“父级”上使用“按范围分区”(日、月...) /root”实体 (A) 和所有子实体 (B) 上的“引用分区”。来自 Oracle 文档:“引用分区允许通过引用约束对彼此相关的两个表进行分区。分区键通过现有的父子关系解析,由启用和活动的主键和外键约束强制执行。” 问题是子实体 (B) 可以引用与“父/根”实体 (A) 没有任何链接的其他实体 (C)。我可以在 A 和 B 上创建分区,但是当我想删除 A 上的分区(级联 B 上的分区)时,我收到一个错误完整性错误并且它失败了。仅当我删除 C 和 B 上的所有记录然后对它们进行分区时,它才有效。我不想这样做,因为与直接删除分区相比,它效率低且速度慢

请问有没有一种方法可以基于 A(creation_date) 在表 C 上创建分区,而不在 A 和 C 之间添加任何外部约束?

小例子来说明情况

A - parent entity
B - child entity to A
C - child entity to  B

create table 
A (
   id number primary key,
   creation_date date
)
partition by range (creation_date) 
INTERVAL(NUMTOYMINTERVAL(1, 'MONTH')) 
(
   partition p1 values less than (to_date('20180501','yyyymmdd'))
);

create table 
B (
   id number primary key,
   value varchar2(5),
   a_id number not null,
   constraint fk_ba foreign key (a_id) references A
)
partition by reference(fk_ba);

create table 
C (
   id number primary key,
   code varchar2(5),
   b_id number not null,
   constraint fk_cb foreign key (b_id) references B
);

标签: oracleoracle11gpartitioning

解决方案


文档中并不清楚按引用分区是可传递的(A->B->C)。我通过测试发现了它。我们可以创建表 C“按引用分区 (fk_cb)”,结果是当我们删除 A 分区时,匹配的 B 和 C 分区将被删除。


推荐阅读