使用上の注意
レベル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);