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

PolarDB:テーブルの変更

最終更新日:May 28, 2024

ALTER TABLEステートメントを実行して、テーブルのスキーマを変更できます。 たとえば、列の追加、インデックスの作成、データ型の変更などができます。

注意

  • ALTER TABLEステートメントを実行してシャードキーを変更することはできません。
  • グローバルセカンダリインデックス (GSI) を含むテーブルでALTER TABLEステートメントを実行する必要がある場合は、MySQL 5.7以降とPolarDB-X 1.0. 5.4.1以降を使用します。

標準テーブルの変更

説明 PolarDB-X 1.0 ALTER TABLEステートメントを実行して標準テーブルのスキーマを変更する場合、DRDSでのこのステートメントの構文はオープンソースMySQLの構文と同じになります。 詳細については、「ALTER TABLEステートメント」をご参照ください。

構文

ALTER [オンライン | オフライン] [IGNORE] TABLE tbl_name
    [alter_specification [, alter_specification] ...]
    [partition_options] 

  • 列の追加

    user_logテーブルにidcard列を追加します。 次のサンプルコードを使用できます。

    ALTER TABLE user_log ADD 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' TO 'idcard_idx_new ';
  • ローカルインデックスの削除

    user_logテーブルからidcard_idxインデックスを削除します。 次のサンプルコードを使用できます。

    ALTER TABLE user_log DROPインデックスidcard_idx;
  • 列の変更

    user_logテーブルのidcard列の長さを30文字から40文字に変更します。 idcard列の値はVARCHAR型です。 次のサンプルコードを使用できます。

    ALTER TABLE user_log MODIFY COLUMN idcard varchar(40);

GSIを含むテーブルの変更

列の変更

ALTER TABLEステートメントを実行して、GSIを含むテーブルの列を変更する場合、このステートメントの構文は、標準テーブルの列の変更に使用する構文と同じになります。 制限に精通していることをお勧めします。 制限の詳細については、「ALTER TABLEステートメントの実行に関する注意事項」をご参照ください。

インデックスの変更

構文

ALTER TABLE tbl_name
    alter_specification# ALTER TABLEステートメントを実行してGSIを変更する場合は、alter_specificationオプションを1回使用します。

alter_specification:
  | ADD GLOBAL {INDEX | KEY} index_name# GSIの名前を明示的に指定します。
      [index_type] (index_sharding_col_name,...)
      global_secondary_index_option
      [index_option] ...
  | ADD [CONSTRAINT [シンボル]] UNIQUE GLOBAL
      [INDEX | KEY] index_name# 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を作成できます。 MySQLの構文と比較して、DRDSの構文ではGSIの作成を指定するGLOBALキーワードが導入されています。

ALTER TABLE { DROP | RENAME } INDEXを使用してGSIを変更することもできます。 テーブルの作成後にGSIを作成する場合は、制限に精通していることをお勧めします。 制限の詳細については、「GSIの使用に関する注意事項」をご参照ください。

GSIの定義に使用される句の詳細については、「CREATE TABLE」をご参照ください。

次の例は、テーブルの作成後に一意の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は、指定する対象の列です。
    • GSIを定義するために使用される条項: GLOBAL INDEX 'g_i_seller 'ON t_order ('seller_id') dbpartition by hash('seller_id')
  • SHOW INDEXステートメントを実行して、インデックス情報を照会します。 たとえば、シャードキーorder_idのローカルインデックスと、buyer_id、id、order_id、およびorder_snapshotの列のGSIをクエリできます。 インデックステーブルの場合、buyer_id列はシャードキー、id列はプライマリキー、order_id列はシャードキーです。 id列とorder_id列はデフォルトのカバー列です。 order_snapshotは、明示的に指定するカバー列です。
    mysql> 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」をご参照ください。
    mysql> 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 |
    + --------------------- ------------------------------------------------- ------------------------------ --------------- + --------------------- + -------------------- + -------------------- + -------------------- + -------------------- + -------------------- + -------------------- + -------------------- + -------------------- + -------------------- +----------- 
  • インデックステーブルのスキーマを表示します。 インデックステーブルには、プライマリテーブルのプライマリキー、データベースシャードキーとテーブルシャードキー、既定のカバーリング列、およびカスタムカバーリング列が含まれます。 AUTO_INCREMENT属性は主キーから削除されます。 ローカルインデックスがプライマリテーブルから削除されます。 デフォルトでは、GSIはインデックステーブルのすべてのシャードキーに作成され、各GSIはグローバルに一意です。
    mysql> 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) デフォルトNULL、
      'order_snapshot' ロングテキスト、
      主要なキー ('id') 、
      ユニークなキー 'auto_shard_key_buyer_id ' ('buyer_id') BTREEを使用
    ) ENGINE=InnoDB DEFAULT CHARSET=ハッシュによるutf8 dbpartition ('buyer_id') |
    + ----------- + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + 
  • GSIを削除します。

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

    ALTER TABLE 't_order' DROP INDEX 'g_i_seller ';
  • GSIの名前を変更します。

    デフォルトでは、GSIの名前は変更できません。