與分割區相關的 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選項。此選項會採用以逗號分隔的一個或多個分割區名稱清單。請考慮由下列陳述式建立的資料表t1: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), 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選項結合使用,例如用於新增、捨棄或重新命名資料行或索引的選項。使用
ENGINE選項搭配ALTER TABLE會變更資料表使用的儲存引擎,而不會影響分割區。目標儲存引擎必須提供自己的分割區處理程式。只有InnoDB和NDB儲存引擎具有原生分割區處理程式。
ALTER TABLE 陳述式有可能包含 PARTITION BY 或 REMOVE PARTITIONING 子句,以及其他變更規格,但 PARTITION BY 或 REMOVE PARTITIONING 子句必須在任何其他規格之後最後指定。
ADD PARTITION、DROP PARTITION、COALESCE PARTITION、REORGANIZE PARTITION、ANALYZE PARTITION、CHECK PARTITION 和 REPAIR PARTITION 選項不能與單一 ALTER TABLE 中的其他變更規格合併使用,因為所列出的選項僅針對個別分割區執行。有關更多資訊,請參閱 第 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 節,「分割區的維護」。