我正在尝试使用Postgresql 10.8中的现有行对表进行分区。结构是这样的:
我正在尝试创建表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)。
那么是否有可能从main表Item
中删除数据,使分区表上仅包含行?还有其他替代方法可以用不同的方式创建分区吗?
如果使用继承分区,将无法使外键指向分区表。您必须先删除约束,然后才能删除行。
我建议使用声明性分区。如果您升级到v11或更高版本,则可以有一个指向分区表的外键,因为分区表上的主键必须包含分区键,所以您必须将该列添加到分区表中。以及外键。由于分区对于删除海量数据最有用,因此以相同的方式分区item_audit
可能很有意义。