すべてのプロダクト
Search
ドキュメントセンター

PolarDB:パーティションの変更

最終更新日:Jun 05, 2024

使用上の注意

  • レベル1のパーティションを変更するには、Alibaba Cloud PolarDB for Xscale (PolarDB-X) インスタンスのバージョンが5.4.14-16539836以降である必要があります。

  • レベル2パーティションを変更するには、PolarDB-Xインスタンスのバージョンが5.4.17-16952556以降である必要があります。

  • HASH、KEY、またはCO_HASHのパーティション分割方法を使用してパーティション分割されたテーブルのパーティションを変更することはできません。

  • RANGEまたはRANGE COLUMNSパーティション分割方法を使用してパーティション分割されたテーブルのパーティションを変更することはできません。

  • LISTまたはLIST COLUMNSパーティション分割メソッドを使用してパーティション分割され、catch-allパーティションDEFAULTを含むテーブルのパーティションを変更することはできません。

  • グローバルインデックステーブルでDROP values操作を実行して値を削除することはできません。

  • グローバルインデックスを含むパーティションテーブルでDROP values操作を実行して値を削除することはできません。

用語

  • テーブルグループ: 同一のパーティションキー列を共有する論理テーブルまたはグローバルインデックステーブルのコレクション。

  • グローバルインデックス: パーティションテーブルのインデックス作成手法。 非パーティションキーを使用して、パーティションテーブルにグローバルインデックスを作成できます。 グローバルインデックスは、一意の制約を提供できます。

構文

ALTER alter_target_definition modify_partition_values_operation_definition

alter_target_definition:
TABLE [db_name.]tbl_name
 | TABLE tbl_name.index_name
 | TABLEGROUP tg_name
 | INDEX index_name ON TABLE [db_name.]tbl_name
 | TABLEGROUP BY TABLE [db_name.]tbl_name
 | TABLEGROUP BY INDEX index_name ON TABLE [db_name.]tbl_name

modify_partition_values_operation_definition:
MODIFY PARTITION part_name values_operation_definition
 | MODIFY SUBPARTITION subpart_name values_operation_definition

values_operation_definition:
ADD VALUES (value_list)
 | ドロップ値 (value_list)

シナリオ1: レベル1パーティションの値の変更

この例では、l_t1およびl_t2テーブルは、LIST分割方法を使用して分割されます。 次のSQL文を実行して、テーブルを作成できます。

CREATE TABLE 'l_t1' (
'a' bigint(20) UNSIGNED NOT NULL、'b' bigint (20) UNSIGNED NOT NULL,
'c' datetime NOT NULL,
'd' varchar (16) NOT NULL,
'e' varchar (16) NOT NULL
) エンジン=InnoDBデフォルト料金=utf8mb4
リストによるパーティー (YEAR('c'))
(
 PARTITION p0の値 (2020,2022、2024,2026) 、
 パーティションp1の値 (2021,2023、2025,2027)
);

CREATE TABLE 'l_t2' (
'a' bigint(20) UNSIGNED NOT NULL、'b' bigint (20) UNSIGNED NOT NULL,
'c' datetime NOT NULL,
'd' varchar (16) NOT NULL,
'e' varchar (16) NOT NULL
) エンジン=InnoDBデフォルト料金=utf8mb4
リストによるパーティー (YEAR('c'))
(
 PARTITION p0の値 (2020,2022、2024,2026) 、
 パーティションp1の値 (2021,2023、2025,2027)
); 

例1: LISTレベル1パーティションへの値の追加

l_t1テーブルのLISTレベル1パーティション (この例ではp1) に値2017と2019を追加します。 次のセクションでは、パーティションに値を追加するために使用されるステートメントについて説明します。

テーブルのパーティションに値を追加する

## テーブル名に基づいてテーブルのパーティションに値を追加します。
ALTER TABLE l_t1 /* テーブル名 * /
パーティションの変更p1追加値 (2017,2019); 

テーブルグループ内のパーティションに値を追加する

次のステートメントを実行して、tg1テーブルグループのl_t1テーブルとl_t2テーブルの両方のパーティションに値を追加します。

## テーブルグループ名に基づいて、テーブルグループ内のパーティションに値を追加します。 この例では、テーブルグループ名はtg1です。
ALTER TABLEGROUP tg1 /* テーブルグループ名 * /
変更パーティションp1追加値 (2017,2019);

## テーブル名に基づいて、同じテーブルグループ内のテーブルのパーティションに値を追加します。 指定したテーブル名に基づいてテーブルグループが自動的に見つかり、テーブルグループ内の対応するパーティションが変更されます。
ALTER TABLEGROUP BY TABLE l_t1 /* テーブル名 * /
パーティションの変更p1追加値 (2017,2019); 

例2: LISTレベル1パーティションからの値の削除

l_t1テーブルのLISTレベル1パーティション (この例ではp1) から値2021と2025を削除します。 次のセクションでは、パーティションから値を削除するために使用されるステートメントについて説明します。

テーブルのパーティションから値を削除

# テーブル名に基づいて、テーブルのパーティションから値を削除します。
ALTER TABLE l_t1 /* テーブル名 * /
修正パーティションp1ドロップ値 (2021,2025); 

テーブルグループ内のパーティションから値を削除する

次のステートメントを実行して、tg1テーブルグループのl_t1テーブルとl_t2テーブルの両方のパーティションから値を削除します。

# テーブルグループ名に基づいて、テーブルグループ内のパーティションから値を削除します。
ALTER TABLEGROUP tg1 /* テーブルグループ名 * /
修正パーティションp1ドロップ値 (2021,2025);

## テーブル名に基づいて、同じテーブルグループ内のテーブルのパーティションから値を削除します。 指定したテーブル名に基づいてテーブルグループが自動的に見つかり、テーブルグループ内の対応するパーティションが変更されます。
ALTER TABLEGROUP BY TABLE l_t1 /* テーブル名 * /
修正パーティションp1ドロップ値 (2021,2025); 

シナリオ2: テンプレート化されたレベル2パーティションの値の変更

この例では、k_l_tp_t1およびk_l_tp_t2という名前のKEY − LIST区分テーブルに、テンプレート化レベル2区分が含まれる。 次のSQL文を実行して、テーブルを作成できます。

CREATE TABLE 'k_l_tp_t1 '(
'a' bigint(20) UNSIGNED NOT NULL、'b' bigint (20) UNSIGNED NOT NULL,
'c' datetime NOT NULL,
'd' varchar (16) NOT NULL,
'e' varchar (16) NOT NULL
) エンジン=InnoDBデフォルト料金=utf8mb4
キーによるパーティー ('a') パーティー2
リストによるサブパート (YEAR('c'))
(
 下位分類sp0の値 (2020,2022、2024,2026) 、
 SUBPARTITION sp1の値 (2021,2023、2025,2027)
);

CREATE TABLE 'k_l_tp_t2 '(
'a' bigint(20) UNSIGNED NOT NULL、'b' bigint (20) UNSIGNED NOT NULL,
'c' datetime NOT NULL,
'd' varchar (16) NOT NULL,
'e' varchar (16) NOT NULL
) エンジン=InnoDBデフォルト料金=utf8mb4
キーによるパーティー ('a') パーティー2
リストによるサブパート (YEAR('c'))
(
 下位分類sp0の値 (2020,2022、2024,2026) 、
 SUBPARTITION sp1の値 (2021,2023、2025,2027)
); 

例1: テンプレート化されたLISTレベル2パーティションに値を追加する

k_l_tp_t1テーブルのテンプレート化されたLISTレベル2パーティション (この例ではsp1) に値2017と2019を追加します。 次のセクションでは、パーティションに値を追加するために使用されるステートメントについて説明します。

テーブルのパーティションに値を追加する

## テーブル名に基づいてテーブルのパーティションに値を追加します。
ALTER TABLE k_l_ntp_t1 /* テーブル名 * /
MODIFY SUBPARTITION sp1 /* レベル2パーティションの名前 */ADD VALUES (2017,2019); 
テーブルグループ内のパーティションに値を追加する

次のステートメントを実行して、tg1テーブルグループのk_l_tp_t1テーブルとk_l_tp_t2テーブルの両方のパーティションに値を追加します。

## テーブルグループ名に基づいて、テーブルグループ内のパーティションに値を追加します。 この例では、テーブルグループ名はtg1です。
ALTER TABLEGROUP tg1 /* テーブルグループ名 * /
MODIFY SUBPARTITION sp1 /* レベル2パーティションの名前 * /追加値 (2017,2019) 。## テーブル名に基づいて、同じテーブルグループ内のテーブルのパーティションに値を追加します。 指定したテーブル名に基づいてテーブルグループが自動的に見つかり、テーブルグループ内の対応するパーティションが変更されます。
ALTER TABLEGROUP BY TABLE k_l_tp_t1 /* テーブル名 * /
MODIFY SUBPARTITION sp1 /* レベル2パーティションの名前 */ADD VALUES (2017,2019); 

例2: テンプレート化LISTレベル2パーティションからの値の削除

k_l_tp_t1テーブルのテンプレート化されたLISTレベル2パーティション (この例ではsp1) から値2021と2025を削除します。 次のセクションでは、パーティションから値を削除するために使用されるステートメントについて説明します。

テーブルのパーティションから値を削除

# テーブル名に基づいて、テーブルのパーティションから値を削除します。
ALTER TABLE k_l_ntp_t1 /* テーブル名 * /
MODIFY SUBPARTITION sp1 /* レベル2パーティションの名前 * /ドロップ値 (2021,202 5); 

テーブルグループ内のパーティションから値を削除する

次の文を実行して、tg1テーブルグループのk_l_tp_t1テーブルとk_l_tp_t2テーブルの両方のパーティションから値を削除します。

# テーブルグループ名に基づいて、テーブルグループ内のパーティションから値を削除します。
ALTER TABLEGROUP tg1 /* テーブルグループ名 * /
MODIFY SUBPARTITION sp1 /* レベル2パーティションの名前 * /ドロップ値 (2021,202 5) 。## テーブル名に基づいて、同じテーブルグループ内のテーブルのパーティションから値を削除します。 指定したテーブル名に基づいてテーブルグループが自動的に見つかり、テーブルグループ内の対応するパーティションが変更されます。
ALTER TABLEGROUP BY TABLE k_l_tp_t1 /* テーブル名 * /
MODIFY SUBPARTITION sp1 /* レベル2パーティションの名前 * /ドロップ値 (2021,202 5); 

シナリオ3: テンプレート化されていないレベル2パーティションの値を変更する

この例では、k_l_ntp_t1およびk_l_ntp_t2という名前のKEY − LIST区分テーブルは、非テンプレート化レベル2区分を含む。 次のSQL文を実行して、テーブルを作成できます。

CREATE TABLE 'k_l_ntp_t1 '(
'a' bigint(20) UNSIGNED NOT NULL、'b' bigint (20) UNSIGNED NOT NULL,
'c' datetime NOT NULL,
'd' varchar (16) NOT NULL,
'e' varchar (16) NOT NULL
) エンジン=InnoDBデフォルト料金=utf8mb4
キーによるパーティー ('a') パーティー2
リストによるサブパート (YEAR('c'))
(
 パートp1 (
 	サブパートp1sp1値 (2020,2022、2024,2026、2028) 、
 	サブパートp1sp2値 (2021,2023、2025,2027、2029)
),
 PARTITION p2 (
 	サブパーツp2sp1値 (2020,2022、2024,2026、2028) 、
 	サブパートp2sp2値 (2021,2023、2025,2027、2029) 、
 	サブパートp2sp3値 (2030,2031)
)
);

CREATE TABLE 'k_l_ntp_t2 '(
'a' bigint(20) UNSIGNED NOT NULL、'b' bigint (20) UNSIGNED NOT NULL,
'c' datetime NOT NULL,
'd' varchar (16) NOT NULL,
'e' varchar (16) NOT NULL
) エンジン=InnoDBデフォルト料金=utf8mb4
キーによるパーティー ('a') パーティー2
リストによるサブパート (YEAR('c'))
(
 パートp1 (
 	サブパートp1sp1値 (2020,2022、2024,2026、2028) 、
 	サブパートp1sp2値 (2021,2023、2025,2027、2029)
),
 PARTITION p2 (
 	サブパーツp2sp1値 (2020,2022、2024,2026、2028) 、
 	サブパートp2sp2値 (2021,2023、2025,2027、2029) 、
 	サブパートp2sp3値 (2030,2031)
)
); 

例1: テンプレート化されていないレベル2パーティションに値を追加する

k_l_ntp_t1テーブルのレベル1パーティションp1の下のテンプレート化されていないレベル2パーティション (この例ではp1sp2) に値2017と2019を追加します。 次のセクションでは、パーティションに値を追加するために使用されるステートメントについて説明します。

テーブルのパーティションに値を追加する

## テーブル名に基づいてテーブルのパーティションに値を追加します。
ALTER TABLE k_l_ntp_t1 /* テーブル名 * /
修飾サブ分割p1sp2追加値 (2017,2019); 

テーブルグループ内のパーティションに値を追加する

次のステートメントを実行して、tg1テーブルグループのk_l_ntp_t1テーブルとk_l_ntp_t2テーブルの両方のパーティションに値を追加します。

## テーブルグループ名に基づいて、テーブルグループ内のパーティションに値を追加します。 この例では、テーブルグループ名はtg1です。
ALTER TABLEGROUP tg1 /* テーブルグループ名 * /
MODIFY SUBPARTITION p1sp2 /* テンプレート化されていないレベル2パーティションの名前 * /追加値 (2017,2019);

## テーブル名に基づいて、同じテーブルグループ内のテーブルのパーティションに値を追加します。 指定したテーブル名に基づいてテーブルグループが自動的に見つかり、テーブルグループ内の対応するパーティションが変更されます。
ALTER TABLEGROUP BY TABLE k_l_ntp_t1 /* テーブル名 * /
MODIFY SUBPARTITION p1sp2 /* テンプレート化されていないレベル2パーティションの名前 * /追加値 (2017,2019); 

例2: テンプレート化されていないLISTレベル2パーティションからの値の削除

k_l_ntp_t1テーブルのレベル1パーティションp1の下のテンプレート化されていないLISTレベル2パーティション (この例ではp1sp2) から値2021と2025を削除します。 次のセクションでは、パーティションから値を削除するために使用されるステートメントについて説明します。

テーブルのパーティションから値を削除

# テーブル名に基づいて、テーブルのパーティションから値を削除します。
ALTER TABLE k_l_ntp_t1 /* テーブル名 * /
MODIFY SUBPARTITION p1sp2 /* テンプレート化されていないレベル2パーティションの名前 * /ドロップ値 (2021,202 5); 

テーブルグループ内のパーティションから値を削除する

次の文を実行して、tg1テーブルグループのk_l_ntp_t1テーブルとk_l_ntp_t2テーブルの両方のパーティションから値を削除します。

# テーブルグループ名に基づいて、テーブルグループ内のパーティションから値を削除します。
ALTER TABLEGROUP tg1 /* テーブルグループ名 * /
修飾サブマウントp1sp2ドロップ値 (2021,2025);

## テーブル名に基づいて、同じテーブルグループ内のテーブルのパーティションから値を削除します。 指定したテーブル名に基づいてテーブルグループが自動的に見つかり、テーブルグループ内の対応するパーティションが変更されます。
ALTER TABLEGROUP BY TABLE k_l_ntp_t1 /* テーブル名 * /
MODIFY SUBPARTITION p1sp2 /* テンプレート化されていないレベル2パーティションの名前 * /ドロップ値 (2021,202 5); 

シナリオ4: グローバルインデックステーブルのパーティション内の値の変更

例1: 指定したグローバルインデックステーブルの指定したLISTレベル1パーティションに値を追加する

この例では、パーティションテーブルr_gl_t1は、g_1というグローバルインデックステーブルを含む。 g_1グローバルインデックステーブルは、LIST分割方法を使用して分割されます。 次のコードブロックに示す対応するSQL文を実行して、r_gl_t1テーブルを作成できます。

CREATE TABLE 'r_gl_t1 '(
'a' bigint(20) UNSIGNED NOT NULL、'b' bigint (20) UNSIGNED NOT NULL,
'c' datetime NOT NULL,
'd' varchar (16) NOT NULL,
'e' varchar (16) NOT NULL,
グローバルインデックス 'g_l' ('a') カバー ('c')
リストによるパーティー ('a') (
 パーティション「p0」の値 (10000,10002、10004,10006、10008) 、PARTITION 'p1' 値 (20000,20001、20002,20003、20004) 、
 PARTITION 'p2' の値 (30000,30001、30002)
 )
) エンジン=InnoDBデフォルト料金=utf8mb4
レンジによるパーティー (年 ('c'))
(PARTITION 'p0' の値は (2020) よりも低く、
 PARTITION 'p1' 値は (2021) 未満です。CREATE TABLE 'r_gl_t2 '(
'a' bigint(20) UNSIGNED NOT NULL、'b' bigint (20) UNSIGNED NOT NULL,
'c' datetime NOT NULL,
'd' varchar (16) NOT NULL,
'e' varchar (16) NOT NULL,
グローバルインデックス 'g_l' ('a') カバー ('c')
リストによるパーティー ('a') (
 パーティション「p0」の値 (10000,10002、10004,10006、10008) 、PARTITION 'p1' 値 (20000,20001、20002,20003、20004) 、
 PARTITION 'p2' の値 (30000,30001、30002)
 )
) エンジン=InnoDBデフォルト料金=utf8mb4
レンジによるパーティー (年 ('c'))
(PARTITION 'p0' の値は (2020) よりも低く、
 PARTITION 'p1' 値は (2021) 未満です。

r_gl_t1テーブルのg_1グローバルインデックステーブルのレベル1パーティション (この例ではp2) に値30003と30004を追加します。 次のセクションでは、パーティションに値を追加するために使用されるステートメントについて説明します。

テーブルのパーティションに値を追加する

## 'Table name'.'Global index name' に基づいて、グローバルインデックステーブルのパーティションに値を追加します。
ALTER TABLE 'r_gl_t1 '.'g_l'
 パーティションの変更p2値の追加 (30003,30004);

## 「グローバルインデックス名」on table「テーブル名」に基づいて、グローバルインデックステーブルのパーティションに値を追加します。
ALTER INDEX 'g_l'/* グローバルインデックス名 */ ON TABLE 'r_gl_t1 '/* テーブル名 * /
 パーティションの変更p2値の追加 (30003,30004);

テーブルグループ内のパーティションに値を追加する

次のステートメントを実行して、tg1テーブルグループのr_gl_t1テーブルとr_gl_t2テーブルの両方のg_1グローバルインデックステーブルのパーティションに値を追加します。

## テーブルグループ名に基づいて、テーブルグループ内のパーティションに値を追加します。 この例では、グローバルインデックステーブルが属するテーブルグループの名前はtg1です。
ALTER TABLEGROUP tg1 /* テーブルグループ名 * / 
 変更パーティションsp2追加値 (30003,30004);;

## 「グローバルインデックス名」に基づいて、同じテーブルグループ内のグローバルインデックステーブルのパーティションに値を追加します。
ALTER TABLEGROUP BY INDEX 'g_l'/* グローバルインデックス名 */ ON TABLE 'r_gl_t1 '/* テーブル名 * /
 パーティションの変更p2追加値 (30003,30004); 

例2: 指定したグローバルインデックステーブルの指定したLISTレベル2パーティションに値を追加する

この例では、パーティションテーブルr_g_kl_t1には、g_klというグローバルインデックステーブルが含まれています。 KEY-LISTグローバルインデックス テーブルg_klはレベル2のパーティションを含みます。 次のコードブロックに示す対応するSQL文を実行して、r_g_kl_t1テーブルを作成できます。

CREATE TABLE 'r_g_kl_t1 '(
'a' bigint(20) UNSIGNED NOT NULL、'b' bigint (20) UNSIGNED NOT NULL,
'c' datetime NOT NULL,
'd' varchar (16) NOT NULL,
'e' varchar (16) NOT NULL,
グローバルインデックス 'g_kl' ('a' 、'b') COVERING ('c')
キーによるパーティー ('b') パーティー2
 	リストによるサブパート ('a')
(
 サブパート「sp0」の値 (10000,10002、10004,10006、10008) 、サブパート 'sp1' 値 (20000,20001、20002,20003、20004) 、
 サブパート「sp2」の値 (30000,30001、30002)
 )
) エンジン=InnoDBデフォルト料金=utf8mb4
レンジによるパーティー (年 ('c'))
(PARTITION 'p0' の値は (2020) よりも低く、
 PARTITION 'p1' 値は (2021) 未満です。
 
CREATE TABLE 'r_g_kl_t2 '(
'a' bigint(20) UNSIGNED NOT NULL、'b' bigint (20) UNSIGNED NOT NULL,
'c' datetime NOT NULL,
'd' varchar (16) NOT NULL,
'e' varchar (16) NOT NULL,
グローバルインデックス 'g_kl' ('a' 、'b') COVERING ('c')
キーによるパーティー ('b') パーティー2
 	リストによるサブパート ('a')
(
 サブパート「sp0」の値 (10000,10002、10004,10006、10008) 、サブパート 'sp1' 値 (20000,20001、20002,20003、20004) 、
 サブパート「sp2」の値 (30000,30001、30002)
 )
) エンジン=InnoDBデフォルト料金=utf8mb4
レンジによるパーティー (年 ('c'))
(PARTITION 'p0' の値は (2020) よりも低く、
 PARTITION 'p1' 値は (2021) 未満です。

r_g_kl_t1テーブルのg_klグローバルインデックステーブルのレベル2パーティション (この例ではsp2) に値30003と30004を追加します。 次のセクションでは、パーティションに値を追加するために使用されるステートメントについて説明します。

テーブルのパーティションに値を追加する

## 'Table name'.'Global index name' に基づいて、グローバルインデックステーブルのパーティションに値を追加します。
ALTER TABLE 'r_g_kl_t1 '.'g_kl'
 変換sp2追加値 (30003,30004);

## 「グローバルインデックス名」on table「テーブル名」に基づいて、グローバルインデックステーブルのパーティションに値を追加します。
ALTER INDEX g_kl/* グローバルインデックス名 */ ON TABLE 'r_g_kl_t1 ' /* テーブル名 * /
 SUBPARTITION sp2追加値の変更 (30003,30004); 

テーブルグループ内のパーティションに値を追加する

次のステートメントを実行して、tg1テーブルグループのr_g_kl_t1テーブルとr_g_kl_t2テーブルの両方のg_klグローバルインデックステーブルのパーティションに値を追加します。

## テーブルグループ名に基づいて、テーブルグループ内のパーティションに値を追加します。 この例では、グローバルインデックステーブルが属するテーブルグループの名前はtg1です。
ALTER TABLEGROUP tg1 /* テーブルグループ名 * / 
 変換sp2追加値 (30003,30004);

## index「グローバルインデックス名」on table「テーブル名」に基づいて、同じテーブルグループ内のすべてのグローバルインデックステーブルのパーティションに値を追加します。
ALTER TABLEGROUP BY INDEX 'g_kl'/* グローバルインデックス名 */ ON TABLE 'r_g_kl_t1 '/* テーブル名 * /
 SUBPARTITION sp2追加値の変更 (30003,30004);