PolarDB PostgreSQL版附加/分离分区的语法完全兼容PostgreSQL。本文详细介绍了其语法及示例。
概述
附加(Attach)分区: 将一个普通表附加到分区表中,成为分区表的一个分区。
分离(Detach)分区: 将一个分区表的分区分离出来,成为一个普通表。它避免了将分区表中的数据直接删除,而是将其分离出来作为一个普通表移至别处。
语法说明
PolarDB PostgreSQL版完全兼容PostgreSQL。关于附加/分离分区的详细语法说明,请参考PostgreSQL文档。
附加分区
ALTER TABLE [ IF EXISTS ] name
ATTACH PARTITION partition_name { FOR VALUES partition_bound_spec | DEFAULT }
上述语法即表示附加一个现有表(该表本身可能已分区)作为目标表的分区。 您可以使用 FOR VALUES
将表附加为特定值的分区,或者使用 DEFAULT
将表附加为默认分区。
在这个附加的过程中,对于目标表中的每个索引,都会在附加的表中创建一个对应的索引。如果对应索引已存在,则将附加到目标表的索引,如同执行 ALTER INDEX ATTACH PARTITION
一样。
如果现有表是外部表,并且目标表上有 UNIQUE 索引,则当前不允许将该表附加为目标表的分区。
分离分区
ALTER TABLE [ IF EXISTS ] name
DETACH PARTITION partition_name [ CONCURRENTLY | FINALIZE ]
上述语法即表示将目标分区表中的指定分区分离出来。分离的分区继续作为独立表存在,但不再与其分离的表有任何联系。 经过分离,目标分区表和分离出来的独立表具有如下变化:
附加到目标表索引的任何索引都将被分离出来。
任何作为目标表中触发器的克隆而创建的触发器都将被删除。
在外键约束中引用此分区的任何表上都会获得共享锁。例如:假设分区表A引用了分区B作为外键,若从分区表B中分离一个分区B_p1,则会对分区表A加上共享锁。
上述语法中还可以指定CONCURRENTLY
或FINALIZE
:
如果指定
CONCURRENTLY
,则会在低级别锁定上运行,以避免阻塞可能正在访问分区表的其他会话。在这种模式下,内部使用两个事务:
在第一个事务期间,对父表和分区都采用
SHARE UPDATE EXCLUSIVE
锁,并将分区标记为正在进行分离; 此时,事务已提交,并且使用分区表的所有其他事务都将等待。所有这些事务完成后,第二个事务将获取分区表上的
SHARE UPDATE EXCLUSIVE
和分区上的ACCESS EXCLUSIVE
,并且分离过程完成。 与分区约束重复的CHECK约束将添加到分区中。
说明CONCURRENTLY不能在事务块中运行,并且如果分区表包含默认分区,则不允许使用CONCURRENTLY。
如果指定了
FINALIZE
,则等待先前取消或中断的DETACH CONCURRENTLY
调用将完成。
示例
附加分区
将cities_partdef附加到cities分区表中作为默认分区:
ALTER TABLE cities
ATTACH PARTITION cities_partdef DEFAULT;
分离分区
将分区measurement_y2015m12从measurement分区表中分离出来,作为一个独立的表。
ALTER TABLE measurement
DETACH PARTITION measurement_y2015m12;