與分割相關的子句,用於 ALTER TABLE,可與分割表格搭配使用,以進行重新分割、新增、刪除、捨棄、匯入、合併和分割分割區,並執行分割維護。
僅在分割表格上使用
partition_options子句與ALTER TABLE,會根據partition_options定義的分割方案重新分割表格。此子句一律以PARTITION BY開頭,並遵循與CREATE TABLE的partition_options子句相同的語法和其他規則(如需更詳細的資訊,請參閱 第 15.1.20 節,「CREATE TABLE 陳述式」),並且還可用於分割尚未分割的現有表格。例如,考慮一個定義如下的(未分割的)表格CREATE TABLE t1 ( id INT, year_col INT );此表格可以使用
HASH進行分割,並使用id資料行作為分割鍵,透過此陳述式分割成 8 個分割區ALTER TABLE t1 PARTITION BY HASH(id) PARTITIONS 8;MySQL 支援
[SUB]PARTITION BY [LINEAR] KEY的ALGORITHM選項。ALGORITHM=1會讓伺服器在計算資料列於分割區中的位置時,使用與 MySQL 5.1 相同的金鑰雜湊函式;ALGORITHM=2表示伺服器採用 MySQL 5.5 及更高版本中為新的KEY分割表格預設實作和使用的金鑰雜湊函式。(使用 MySQL 5.5 及更高版本中採用的金鑰雜湊函式建立的分割表格,無法由 MySQL 5.1 伺服器使用。)未指定此選項的效果與使用ALGORITHM=2相同。此選項主要用於在 MySQL 5.1 和更新的 MySQL 版本之間升級或降級[LINEAR] KEY分割表格時,或是在 MySQL 5.5 或更高版本的伺服器上建立以KEY或LINEAR KEY分割的表格,這些表格可在 MySQL 5.1 伺服器上使用。使用
ALTER TABLE ... PARTITION BY陳述式產生的表格,必須遵循與使用CREATE TABLE ... PARTITION BY建立的表格相同的規則。這包括管理表格可能擁有的任何唯一鍵(包括任何主鍵),以及分割運算式中使用的資料行或資料行之間關係的規則,如 第 26.6.1 節,「分割鍵、主鍵和唯一鍵」中所述。指定分割區數量的CREATE TABLE ... PARTITION BY規則也適用於ALTER TABLE ... PARTITION BY。ALTER TABLE ADD PARTITION的partition_definition子句支援與CREATE TABLE陳述式同名子句相同的選項。(如需語法和說明,請參閱 第 15.1.20 節,「CREATE TABLE 陳述式」。)假設您有一個分割表格,建立方式如下所示CREATE TABLE t1 ( id INT, year_col INT ) PARTITION BY RANGE (year_col) ( PARTITION p0 VALUES LESS THAN (1991), PARTITION p1 VALUES LESS THAN (1995), PARTITION p2 VALUES LESS THAN (1999) );您可以新增一個新的分割區
p3到此表格,以儲存小於2002的值,如下所示ALTER TABLE t1 ADD PARTITION (PARTITION p3 VALUES LESS THAN (2002));DROP PARTITION可用於刪除一個或多個RANGE或LIST分割區。此陳述式不能與HASH或KEY分割區一起使用;請改用COALESCE PARTITION(請參閱本節稍後部分)。partition_names清單中命名的已刪除分割區中儲存的任何資料都會被捨棄。例如,假設之前定義的表格t1,您可以刪除名為p0和p1的分割區,如下所示ALTER TABLE t1 DROP PARTITION p0, p1;注意DROP PARTITION不適用於使用NDB儲存引擎的表格。請參閱 第 26.3.1 節,「RANGE 和 LIST 分割區的管理」,以及 第 25.2.7 節,「NDB Cluster 的已知限制」。ADD PARTITION和DROP PARTITION目前不支援IF [NOT] EXISTS。DISCARD PARTITION ... TABLESPACE和IMPORT PARTITION ... TABLESPACE選項將可攜式表格空間功能延伸到個別的InnoDB表格分割區。每個InnoDB表格分割區都有其自己的表格空間檔案(.ibd檔案)。可攜式表格空間功能可讓您輕鬆地將表格空間從執行中的 MySQL 伺服器執行個體複製到另一個執行中的執行個體,或在同一個執行個體上執行還原。這兩個選項都採用以逗號分隔的一個或多個分割區名稱清單。例如ALTER TABLE t1 DISCARD PARTITION p2, p3 TABLESPACE;ALTER TABLE t1 IMPORT PARTITION p2, p3 TABLESPACE;在子分割表格上執行
DISCARD PARTITION ... TABLESPACE和IMPORT PARTITION ... TABLESPACE時,允許使用分割區和子分割區名稱。指定分割區名稱時,會包含該分割區的子分割區。可攜式表格空間功能也支援複製或還原分割的
InnoDB表格。如需詳細資訊,請參閱 第 17.6.1.3 節,「匯入 InnoDB 表格」。支援分割表格的重新命名。您可以使用
ALTER TABLE ... REORGANIZE PARTITION間接重新命名個別的分割區;但是,此作業會複製分割區的資料。若要從選取的分割區中刪除資料列,請使用
TRUNCATE PARTITION選項。此選項會採用以逗號分隔的一個或多個分割區名稱清單。請考慮使用此陳述式建立的表格t1CREATE TABLE t1 ( id INT, year_col INT ) PARTITION BY RANGE (year_col) ( PARTITION p0 VALUES LESS THAN (1991), PARTITION p1 VALUES LESS THAN (1995), PARTITION p2 VALUES LESS THAN (1999), PARTITION p3 VALUES LESS THAN (2003), PARTITION p4 VALUES LESS THAN (2007) );若要從分割區
p0中刪除所有資料列,請使用以下陳述式ALTER TABLE t1 TRUNCATE PARTITION p0;剛才顯示的陳述式與以下
DELETE陳述式具有相同的效果DELETE FROM t1 WHERE year_col < 1991;截斷多個分割區時,分割區不需要是連續的:這可以大幅簡化分割表格上的刪除作業,否則如果使用
DELETE陳述式,則需要非常複雜的WHERE條件。例如,此陳述式會刪除分割區p1和p3中的所有資料列ALTER TABLE t1 TRUNCATE PARTITION p1, p3;以下顯示等效的
DELETE陳述式DELETE FROM t1 WHERE (year_col >= 1991 AND year_col < 1995) OR (year_col >= 2003 AND year_col < 2007);如果您使用
ALL關鍵字來取代分割區名稱清單,則此陳述式會對所有表格分割區執行動作。TRUNCATE PARTITION僅刪除資料列;它不會變更表格本身的定義,或任何分割區的定義。若要驗證是否已刪除資料列,請檢查
INFORMATION_SCHEMA.PARTITIONS表格,使用如下查詢SELECT PARTITION_NAME, TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME = 't1';COALESCE PARTITION可與依HASH或KEY分割的表格搭配使用,以將分割區數量減少number。假設您已建立表格t2如下CREATE TABLE t2 ( name VARCHAR (30), started DATE ) PARTITION BY HASH( YEAR(started) ) PARTITIONS 6;若要將
t2使用的分割區數量從 6 個減少到 4 個,請使用以下陳述式ALTER TABLE t2 COALESCE PARTITION 2;最後
number個分割區中包含的資料會合併到剩餘的分割區中。在此情況下,分割區 4 和 5 會合併到前 4 個分割區(編號為 0、1、2 和 3 的分割區)。若要變更分割表格使用的一部分而不是所有分割區,可以使用
REORGANIZE PARTITION。此陳述式可以使用幾種方式若要將一組分割區合併為單一分割區。方法是在
partition_names清單中命名數個分割區,並為partition_definition提供單一定義。若要將現有分割區分割成數個分割區。方法是為
partition_names命名單一分割區,並提供多個partition_definitions。若要使用
VALUES LESS THAN變更分割區子集的範圍,或使用VALUES IN變更分割區子集的值清單。
注意對於未明確命名的分割區,MySQL 會自動提供預設名稱
p0、p1、p2等等。子分割區的情況也是如此。如需關於
ALTER TABLE ... REORGANIZE PARTITION陳述式的詳細資訊和範例,請參閱 第 26.3.1 節,「RANGE 和 LIST 分割區的管理」。若要將表格分割區或子分割區與表格交換,請使用
ALTER TABLE ... EXCHANGE PARTITION陳述式—也就是說,將分割區或子分割區中的任何現有資料列移至未分割的表格,並將未分割表格中的任何現有資料列移至表格分割區或子分割區。一旦使用
ALGORITHM=INSTANT將一個或多個資料行新增至分割表格後,就無法再與該表格交換分割區。如需使用資訊和範例,請參閱 第 26.3.3 節,「使用表格交換分割區和子分割區」。
有幾個選項提供分割維護和修復功能,類似於
CHECK TABLE和REPAIR TABLE等陳述式針對未分割表格實作的功能(這些陳述式也支援分割表格;如需詳細資訊,請參閱 第 15.7.3 節,「表格維護陳述式」)。這些包括ANALYZE PARTITION、CHECK PARTITION、OPTIMIZE PARTITION、REBUILD PARTITION和REPAIR PARTITION。這些選項中的每一個選項都會採用一個partition_names子句,其中包含一個或多個以逗號分隔的分割區名稱。分割區必須已存在於目標表格中。您也可以使用ALL關鍵字來取代partition_names,在這種情況下,陳述式會對所有表格分割區執行動作。如需詳細資訊和範例,請參閱 第 26.3.4 節,「分割區的維護」。目前
InnoDB不支援針對每個分割區進行最佳化;ALTER TABLE ... OPTIMIZE PARTITION會導致重建並分析整個表格,並發出適當的警告。(錯誤 #11751825,錯誤 #42822)要解決此問題,請改用ALTER TABLE ... REBUILD PARTITION和ALTER TABLE ... ANALYZE PARTITION。對於未分割的表格,不支援
ANALYZE PARTITION、CHECK PARTITION、OPTIMIZE PARTITION和REPAIR PARTITION選項。REMOVE PARTITIONING可讓您移除表格的分割,而不會以其他方式影響表格或其資料。此選項可以與其他ALTER TABLE選項組合使用,例如用於新增、刪除或重新命名欄或索引的選項。使用
ALTER TABLE的ENGINE選項會變更表格使用的儲存引擎,而不會影響分割。目標儲存引擎必須提供自己的分割處理常式。只有InnoDB和NDB儲存引擎具有原生的分割處理常式。
ALTER TABLE 陳述式可以包含 PARTITION BY 或 REMOVE PARTITIONING 子句,以及其他 alter 規格,但 PARTITION BY 或 REMOVE PARTITIONING 子句必須在任何其他規格之後最後指定。
ADD PARTITION、DROP PARTITION、COALESCE PARTITION、REORGANIZE PARTITION、ANALYZE PARTITION、CHECK PARTITION 和 REPAIR PARTITION 選項不能在單一 ALTER TABLE 中與其他 alter 規格組合使用,因為剛剛列出的選項會作用於個別的分割區。如需更多資訊,請參閱第 15.1.9.1 節,「ALTER TABLE 分割區操作」。
在指定的 ALTER TABLE 陳述式中,下列選項中只能使用單一執行個體:PARTITION BY、ADD PARTITION、DROP PARTITION、TRUNCATE PARTITION、EXCHANGE PARTITION、REORGANIZE PARTITION 或 COALESCE PARTITION、ANALYZE PARTITION、CHECK PARTITION、OPTIMIZE PARTITION、REBUILD PARTITION、REMOVE PARTITIONING。
例如,下列兩個陳述式是無效的
ALTER TABLE t1 ANALYZE PARTITION p1, ANALYZE PARTITION p2;
ALTER TABLE t1 ANALYZE PARTITION p1, CHECK PARTITION p2;在第一種情況下,您可以使用單一陳述式與列出要分析的兩個分割區的單一 ANALYZE PARTITION 選項,同時分析表格 t1 的分割區 p1 和 p2,如下所示
ALTER TABLE t1 ANALYZE PARTITION p1, p2;在第二種情況下,無法同時對同一個表格的不同分割區執行 ANALYZE 和 CHECK 操作。您必須改為發出兩個獨立的陳述式,如下所示
ALTER TABLE t1 ANALYZE PARTITION p1;
ALTER TABLE t1 CHECK PARTITION p2;
目前不支援針對子分割區執行 REBUILD 操作。子分割區明確不允許使用 REBUILD 關鍵字,如果這樣使用,會導致 ALTER TABLE 失敗並出現錯誤。
當要檢查或修復的分割區包含任何重複鍵錯誤時,CHECK PARTITION 和 REPAIR PARTITION 操作將會失敗。
如需有關這些陳述式的更多資訊,請參閱第 26.3.4 節,「分割區的維護」。