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
的唯一性。但我认为这是你能拥有的最好的。
我们在 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
的唯一性。但我认为这是你能拥有的最好的。