oracle - 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
);
解决方案
文档中并不清楚按引用分区是可传递的(A->B->C)。我通过测试发现了它。我们可以创建表 C“按引用分区 (fk_cb)”,结果是当我们删除 A 分区时,匹配的 B 和 C 分区将被删除。
推荐阅读
- powershell - 从 PowerShell 获取 Unix 秒的最“惯用”方式是什么?
- java - 如何根据 JUnit 中的测试大小对测试进行分类
- python - 将 LIL 稀疏矩阵的所有元素设置为零,同时保持其稀疏性
- drake - drake:搜索系统的固定点和修剪点
- apache - Apache modsecurity:限制每秒每个资源的请求
- geospatial - 如何在spotfire中刷新形状数据文件
- python - 如何从 Python 控制台应用程序中删除特殊字符和间距?
- php - 如何在 php7 中激活 json 扩展?
- php - 在php codeigniter中获取Referrer Url
- android - 我在删除图像按钮背景时遇到错误