PolarDB PostgreSQL版(兼容Oracle)附加/分離分區的語法完全兼容PostgreSQL。本文詳細介紹了其語法及示例。
概述
附加(Attach)分區: 將一個普通表附加到分區表中,成為分區表的一個分區。
分離(Detach)分區: 將一個分區表的分區分離出來,成為一個普通表。它避免了將分區表中的數據直接刪除,而是將其分離出來作為一個普通表移至別處。
語法說明
附加分區
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;