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

PolarDB:ALTER TABLE (DRDSモード)

最終更新日:Jun 17, 2024

ALTER TABLEステートメントを使用して、テーブルのスキーマを変更できます。 たとえば、列を追加したり、インデックスを追加したり、列のデータ型やその他の属性を変更したりできます。 このトピックで説明する構文は、分散リレーショナルデータベースサービス (DRDS) モードのデータベースにのみ適用されます。

使用上の注意

ALTER TABLEステートメントを使用して、テーブルのシャードキーを変更することはできません。

構文

説明

ALTER TABLEステートメントを使用して、列を追加したり、インデックスを作成したり、列のデータ型やその他の属性を変更したりできます。 構文の詳細については、「MySQL ALTER TABLEステートメント」をご参照ください。

ALTER TABLE tbl_name
    [alter_specification [, alter_specification] ...]
    [partition_options] 

  • 列の追加

    次のステートメントを実行して、idcardという名前の列をuser_logテーブルに追加します。

    ALTER TABLE user_log
        COLUMN idcard varcharを追加 (30); 
  • ローカルインデックスの作成

    次のステートメントを実行して、user_logテーブルのidcard列にidcard_idxという名前のインデックスを作成します。

    ALTER TABLE user_log
        ADD INDEX idcard_idx (idcard); 
  • ローカルインデックスの名前変更

    次のステートメントを実行して、user_logテーブルでidcard_idxインデックスをidcard_idx_newに名前を変更します。

    ALTER TABLE user_log
        RENAME INDEX 'idcard_idx' を 'idcard_idx_new '; 
  • ローカルインデックスの削除

    次の文を実行して、user_logテーブルからidcard_idxインデックスを削除します。

    ALTER TABLE user_log
        DROP INDEX idcard_idx; 
  • 列の変更

    次のステートメントを実行して、user_logテーブルのVARCHARデータ型を使用するidcard列の最大長を30文字から40文字に変更します。

    ALTER TABLE user_log
        MODIFY COLUMN idcard varchar(40); 

GSI

PolarDB-Xはグローバルセカンダリインデックス (GSI) をサポートしています。 GSIの詳細については、「GSI」をご参照ください。

列の変更

GSIを持つテーブルの場合、列を変更する構文は、GSIを持たないテーブルの構文と同じです。

説明

GSIを持つテーブルの列を変更するときは、制限に注意してください。 GSIの制限と規則については、「グローバルセカンダリインデックスの使用方法」をご参照ください。

インデックスの変更

構文

ALTER TABLE tbl_name
    alter_specification# ALTER TABLEステートメントを使用してグローバルセカンダリインデックスを変更する場合、alter_specificationオプションは1回だけ使用できます。

alter_specification:
  | ADD GLOBAL {INDEX | KEY} index_name# GSIを追加するには、GSIの名前を明示的に指定する必要があります。
      [index_type] (index_sharding_col_name,...)
      global_secondary_index_option
      [index_option] ...
  | ADD [CONSTRAINT [シンボル]] UNIQUE GLOBAL
      [INDEX | KEY] index_name# GSIを追加するには、GSIの名前を明示的に指定する必要があります。
      [index_type] (index_sharding_col_name,...)
      global_secondary_index_option
      [index_option] ...
  | DROP {INDEX | KEY} index_name
  | RENAME {INDEX | KEY} old_index_nameからnew_index_nameへ

global_secondary_index_option:
    [COVERING (col_name,...)] # カバーインデックス
    drds_partition_options# index_sharding_col_nameにリストされている1つ以上の列を指定します。

# シャーディング方法を指定します。
drds_partition_options:
    db_sharding_algorithmによるDBPARTITION
    [TBPARTITION BY {table_sharding_algorithm} [TBPARTITIONS num]]
db_sharding_algorithm:
    HASH([col_name])
  | {YYYYMM | YYYYWEEK | YYYYDD | YYYYMM_OPT | YYYYWEEK_OPT | YYYYDD_OPT}(col_name)
  | UNI_HASH(col_name)
  | RIGHT_SHIFT(col_name, n)
  | RANGE_HASH(col_name, col_name, n)
table_sharding_algorithm: 
    HASH(col_name) 
  | {MM | DD | WEEK | MMDD | YYYYMM | YYYYWEEK | YYYYYYWEEK | YYYYMM_OPT | YYYYYYWEEK_OPT | YYYYDD_OPT}(col_name)
  | UNI_HASH(col_name)
  | RIGHT_SHIFT(col_name, n)
  | RANGE_HASH(col_name, col_name, n)

# MySQL DDL構文
index_sharding_col_name:
    col_name [(length)] [ASC | DESC]
index_option:
    KEY_BLOCK_SIZE [=] 値
  | index_type
  | PARSER parser_name付き
  | コメント '文字列'
index_type:
    USING {BTREE | ハッシュ} 

ALTER TABLE ADD GLOBAL INDEX構文は、既存のテーブルにGSIを追加するために使用されます。 構文は、追加されたインデックスがGSIであることを指定するために、GLOBALキーワードをMySQL構文に導入します。

ALTER TABLE { DROP | RENAME } INDEX構文を使用して、GSIを削除または名前変更できます。 既存のテーブルにGSIを追加するときは、制限に注意してください。 GSIの制限と規則の詳細については、「グローバルセカンダリインデックスの使用方法」をご参照ください。

GSIの作成に使用できる句については、「create TABLE (DRDSモード) 」をご参照ください。

  • 既存のテーブルにGSIを作成する

    次の例は、既存のテーブルにGSIを作成する方法を示しています。

    # テーブルを作成します。
    CREATE TAB_order (
      'id' bigint(11) NOT NULL AUTO_INCREMENT、
      'order_id' varchar(20) DEFAULT NULL、
      'buyer_id 'varchar(20) デフォルトNULL、
      'seller_id 'varchar(20) DEFAULT NULL、
      'order_snapshot' ロングテキストDEFAULT NULL、
      'order_detail' ロングテキストDEFAULT NULL、
      主要なキー ('id') 、
      KEY 'L_i_order ' ('order_id')
    ) ENGINE=InnoDB DEFAULT CHARSET=ハッシュによるutf8 dbpartition ('order_id');
    # GSIを作成します。
    ALTER TABLE t_order ADD UNIQUEグローバルインデックス 'g_i_buyer ' ('buyer_id') カバー ('order_snapshot') dbpartition by hash('buyer_id'); 
    • t_orderはベーステーブルです。 ベーステーブルは、order_id列のハッシュ値に基づいて複数のデータベースシャードに分散されます。

    • g_i_buyerはインデックステーブルです。 インデックステーブルは、buyer_id列のハッシュ値に基づいて複数のデータベースシャードに分散されます。 order_snapshot列はカバー列として指定されます。

    • GLOBAL INDEX 'g_i_seller 'ON t_order ('seller_id') dbpartition by hash('seller_id') 句は、GSIを定義する。

    SHOW INDEXステートメントを使用して、テーブルのインデックスを照会できます。 この例では、t_orderテーブルのインデックスには、シャードキー列order_idのローカルインデックスと、buyer_id、id、order_id、およびorder_snapshot列のGSIが含まれます。 buyer_idはインデックステーブルのシャードキー、id (プライマリキー) とorder_id (インデックステーブルのシャードキー) はデフォルトのカバー列、order_snapshotは明示的に指定されたカバー列です。

    説明

    GSIの制限と規則については、「グローバルセカンダリインデックスの使用方法」をご参照ください。 SHOW INDEXステートメントの詳細については、「SHOW INDEX」をご参照ください。

    show index from t_order;

    次の情報が返されます。

    + ---------------------------------------------------------------------------------------------
    | テーブル | NON_UNIQUE | KEY_NAME | SEQ_IN_INDEX | COLUMN_NAME | COLLATION | CARDINALITY | SUB_PART | PACKED | NULL | INDEX_TYPE | COMMENT | INDEX_COMMENT |
    ---------------- -----------------------------------------------------------------------------------------------------------------
    | t_order | 0 | PRIMARY | 1 | id | A | 0 | NULL | NULL | | BTREE | |
    | t_order | 1 | l_i_order | 1 | order_id | A | 0 | NULL | NULL | YES | BTREE | |
    | t_order | 0 | g_i_buyer | 1 | buyer_id | NULL | 0 | NULL | NULL | YES | グローバル | インデックス | |
    | t_order | 1 | g_i_buyer | 2 | id | NULL | 0 | NULL | NULL | | グローバル | カバー | |
    | t_order | 1 | g_i_buyer | 3 | order_id | NULL | 0 | NULL | NULL | YES | グローバル | カバー | |
    | t_order | 1 | g_i_buyer | 4 | order_snapshot | NULL | 0 | NULL | NULL | YES | グローバル | カバー | |
    ---------------- -----------------------------------------------------------------------------------------------------------------

    SHOW GLOBAL INDEXステートメントを実行して、GSIに関する情報を照会できます。 詳細については、「SHOW GLOBAL INDEX」をご参照ください。

    show global index from t_order;

    次の情報が返されます。

    --------------------- --------- ---------------------------------------------------- ------------------------------ + --------------------- + -------------------- + -------------------- + -------------------- + -------------------- + -------------------- +---------------
    | スキーマ | テーブル | NON_UNIQUE | KEY_NAME | INDEX_NAMES | COVERING_NAMES | INDEX_TYPE | DB_PARTITION_POLICY | DB_PARTITION_POLICY | DB_PARTITION_COUNT | TB_PARTITION_KEY | TB_PARTITION_COUNTIUS
    + --------------------- ------------------------------------------------- ------------------------------ --------------- +
    | ZZY3_DRDS_LOCAL_APP | t_order | 0 | g_i_buyer | buyer_id | id、order_id、order_snapshot | NULL | buyer_id | HASH | 4 | | NULL | NULL | PUBLIC |
    + --------------------- ------------------------------------------------- ------------------------------ --------------- + --------------------- + -------------------- + -------------------- + -------------------- + -------------------- + -------------------- + -------------------- + -------------------- + -------------------- + -------------------- +----------- 

    次のステートメントを使用して、インデックステーブルのスキーマを照会できます。 次の例では、g_i_buyerインデックステーブルに、ベーステーブルの主キー、データベースシャードキーとテーブルシャードキー、既定のカバーリング列、およびカスタムカバーリング列が含まれます。 インデックステーブルの主キーにはAUTO_INCREMENT属性がなく、ベーステーブルのローカルインデックスが削除されます。 グローバル一意の制約を確保するために、すべてのシャードキーにグローバル一意のインデックスが作成されます。

    show create table g_i_buyer;

    次の情報が返されます。

    + ----------- + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ +
    | テーブル | テーブルの作成 |
    + ----------- + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ +
    | g_i_buyer | CREATE TABLE 'g_i_buyer ' ('id' bigint(11) NOT NULL、'order_id' varchar(20) DEFAULT NULL、'buyer_id 'varchar(20) DEFAULT NULL、'order_snapshot' buyer, 'db_buy' ('REut_hash) 8), UNIQUE 'SESET'_h_SET' ('inSET 'InnoYキー', ', 'in')
    + ----------- + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + 
  • GSIの削除

    g_i_sellerという名前のGSIを削除します。 対応するインデックステーブルも削除されます。

    # g_i_sellerという名前のGSIを削除します。
    ALTER TABLE 't_order' DROP INDEX 'g_i_seller '; 
  • GSIの名前変更

    デフォルトでは、GSIの名前は変更できません。 GSIの制限と規則については、「グローバルセカンダリインデックスの使用方法」をご参照ください。