PostgreSQL创建具有现有行并具有参照完整性的表分区

问题描述 投票:3回答:1

我正在尝试使用Postgresql 10.8中的现有行对表进行分区。结构是这样的:enter image description here

我正在尝试创建表Item的分区,它具有约5毫米的行。我使用这些命令创建分区:

CREATE TABLE item_1 (CHECK (id >0 AND id <1000001)) INHERITS (item);
CREATE TABLE item_2 (CHECK (id >1000000 AND id <2000001)) INHERITS (item);
...

然后是规则:

 CREATE RULE item_1_rule AS ON INSERT TO item WHERE (id >0 AND id <1000001) DO INSTEAD INSERT INTO item_1 VALUES (NEW.*);
 CREATE RULE item_2_rule AS ON INSERT TO item WHERE (id >1000000 AND id <2000001) DO INSTEAD INSERT INTO item_2 VALUES (NEW.*);
...

然后迁移到分区表:

INSERT INTO item_1 SELECT * FROM item WHERE (id >0 AND id <1000001);
INSERT INTO item_2 SELECT * FROM item WHERE (id >1000000 AND id <2000001);
...

最后,我尝试删除Item表中的所有行:

DELETE FROM ONLY item;

但我收到此错误:

错误:对表“ item”进行更新或删除违反了外键约束>对表“ item_audit”进行了“ item_audit_item_id_fkey”SQL状态:23503详细信息:仍从表“ item_audit”中引用键(id)=(1)。

那么是否有可能从mainItem中删除数据,使分区表上仅包含行?还有其他替代方法可以用不同的方式创建分区吗?

postgresql
1个回答
3
投票

如果使用继承分区,将无法使外键指向分区表。您必须先删除约束,然后才能删除行。

我建议使用声明性分区。如果您升级到v11或更高版本,则可以有一个指向分区表的外键,因为分区表上的主键必须包含分区键,所以您必须将该列添加到分区表中。以及外键。由于分区对于删除海量数据最有用,因此以相同的方式分区item_audit可能很有意义。

© www.soinside.com 2019 - 2024. All rights reserved.