Postgresql 13 - 支持按引用分区

Postgresql 13 - Support for partition by reference

我们在 Oracle 中设置了以下分区,我们需要将其迁移到 Postgresql(版本 13)-

CREATE TABLE A (
id number(10) not null,
name varchar2(100),
value varchar2(100),
createdat date
constraint a_pk primary key (id))
partition by range (createdat);

CREATE TABLE B (
id number(10) not null,
a_id number(10) not null,
....
....
constraint b_pk primary key (id),
constraint b_a_fk foreign key (a_id) references a (id) on delete cascade
) partition by reference (b_a_fk)

Postgresql 不支持按引用分区。任何人都可以建议在 Postgresql 中实现相同目标的替代方案。基本上,我们需要确保当旧分区从两个 table 中删除时,table“B”中的所有记录都应与“A”中的相关记录相对应地删除。

您必须在 b 中保留 createdat 的冗余副本,以便您可以将其用作分区键。

为了使相关日期相同,请考虑以下想法:

  • 您不能将 id 作为主键,因为它不包含分区键 createdat

  • 所以使用 (id, createdat) 作为 a

    的主键
  • 那么可以在(a_id, createdat)上定义b上的外键,这样会自动保证相关日期相同

当然,该解决方案并不完美——尤其是,您无法保证 id 的唯一性。但我认为这是你能拥有的最好的。