説明
このステートメントは、既存のテーブルの構造を変更するために使用します。例えば、テーブル名やテーブル属性の変更、列の追加、列や属性の変更、列の削除などが含まれます。
構文
alter_table_stmt:
ALTER TABLE table_name alter_table_action_list;
alter_table_action_list:
alter_table_action [, alter_table_action ...]
alter_table_action:
ADD [COLUMN] column_definition
[ opt_position_column ]
| ADD [COLUMN] (column_definition_list)
| ADD [CONSTRAINT [constraint_name]] UNIQUE {INDEX | KEY}
[index_name] index_desc
| ADD [CONSTRAINT [constraint_name]] FOREIGN KEY
[index_name] index_desc
REFERENCES reference_definition
[match_action][opt_reference_option_list]
| ADD PRIMARY KEY (column_name)
| ADD CONSTRAINT [constraint_name] CHECK (expression)[[NOT] ENFORCED]
| ADD PARTITION (range_partition_list)
| ADD {INDEX | KEY} [index_name] [index_type] (key_part,...) [index_option_list][index_column_group_option]
| ADD FULLTEXT [INDEX | KEY] [index_name](column_name, [column_name ...]) [WITH PARSER tokenizer_option] [PARSER_PROPERTIES[=](parser_properties_list)] [LOCAL]
| ADD COLUMN GROUP([all columns, ]each column) [DELAYED]
| ALTER [COLUMN] column_name {
SET DEFAULT const_value
| DROP DEFAULT
}
| ALTER {CHECK | CONSTRAINT} symbol [NOT] ENFORCED
| ALTER INDEX index_name [VISIBLE | INVISIBLE] [STORAGE_CACHE_POLICY = {"hot"|"auto"|"none"}]
| CHANGE [COLUMN] column_name column_definition
| DROP [COLUMN] column_name [, DROP COLUMN column_name ...]
| DROP {PARTITION | SUBPARTITION} partition_name_list
| DROP TABLEGROUP
| DROP FOREIGN KEY fk_name
| DROP PRIMARY KEY [, ADD PRIMARY KEY (column)]
| DROP CHECK constraint_name
| DROP COLUMN GROUP([all columns, ]each column)
| MODIFY [COLUMN] column_definition
| RENAME COLUMN old_col_name [TO|AS] new_col_name
| RENAME [TO|AS] table_name
| RENAME {INDEX | KEY} old_index_name [TO|AS] new_index_name
| [SET] table_option_list
| TRUNCATE {PARTITION | SUBPARTITION} partition_name_list
| EXCHANGE PARTITION partition_name WITH TABLE origin_table_name WITHOUT VALIDATION
| REORGANIZE PARTITION partition_name INTO (split_range_partition_list)
| PARTITION BY {RANGE [COLUMNS]([column_name_list]) [SIZE('size_value')] [range_partition_list]
| partition_option}
| MODIFY PARTITION partition_name ADD SUBPARTITION (add_subpartition_option)
| ALTER {PARTITION | SUBPARTITION} partition_name STORAGE_CACHE_POLICY = {"hot" | "auto" | "none"}
| FORCE
column_definition_list:
column_definition [, column_definition ...]
column_definition:
column_name data_type
[DEFAULT const_value] [AUTO_INCREMENT]
[NULL | NOT NULL] [[PRIMARY] KEY] [UNIQUE [KEY]] [COMMENT string_value] [SKIP_INDEX(skip_index_option_list)] [ opt_position_column ]
skip_index_option_list:
skip_index_option [,skip_index_option ...]
skip_index_option:
MIN_MAX
| SUM
opt_position_column:
FIRST | BEFORE | AFTER column_name
index_desc:
(column_desc_list) [index_type] [index_option_list]
match_action:
MATCH {SIMPLE | FULL | PARTIAL}
opt_reference_option_list:
reference_option [,reference_option ...]
reference_option:
ON {DELETE | UPDATE} {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}
column_desc_list:
column_desc [, column_desc ...]
column_desc:
column_name [(length)] [ASC | DESC]
key_part:
{index_col_name [(length)] | (expr)} [ASC | DESC]
index_type:
USING BTREE
index_option_list:
index_option [ index_option ...]
index_option:
[GLOBAL | LOCAL]
| block_size
| compression
| STORING(column_name_list)
| COMMENT string_value
| STORAGE_CACHE_POLICY (storage_cache_policy_option)
index_column_group_option:
WITH COLUMN GROUP([all columns, ]each column)
tokenizer_option:
SPACE
| NGRAM
| BENG
| IK
| NGRAM2
parser_properties_list:
parser_properties, [parser_properties]
parser_properties:
min_token_size = int_value
| max_token_size = int_value
| ngram_token_size = int_value
| ik_mode = 'char_value'
| min_ngram_size = int_value
| max_ngram_size = int_value
table_option_list:
table_option [ table_option ...]
table_option:
TABLEGROUP = tablegroup_name
| block_size
| lob_inrow_threshold [=] num
| compression
| AUTO_INCREMENT [=] INT_VALUE
| COMMENT string_value
| parallel_clause
| TABLE_MODE [=] 'table_mode_value'
| AUTO_INCREMENT_CACHE_SIZE [=] INT_VALUE
| READ {ONLY | WRITE}
| DUPLICATE_SCOPE= 'none | cluster'
| enable_macro_block_bloom_filter [=] {True | False}
| DYNAMIC_PARTITION_POLICY [=] (dynamic_partition_policy_list)
| SEMISTRUCT_ENCODING_TYPE [=] 'encoding' # V4.4.1以降のバージョンでは廃止され、SEMISTRUCT_PROPERTIESに置き換えられました。
| SEMISTRUCT_PROPERTIES [=] (encoding_type=encoding|none[,freq_threshold=INT_VALUE])
| STORAGE_CACHE_POLICY (storage_cache_policy_option)
parallel_clause:
{NOPARALLEL | PARALLEL integer}
table_mode_value:
NORMAL
| QUEUING
| MODERATE
| SUPER
| EXTREME
dynamic_partition_policy_list:
dynamic_partition_policy_option [, dynamic_partition_policy_option ...]
dynamic_partition_policy_option:
ENABLE = {true | false}
| PRECREATE_TIME = {'-1' | '0' | 'n {hour | day | week | month | year}'}
| EXPIRE_TIME = {'-1' | '0' | 'n {hour | day | week | month | year}'}
partition_option:
PARTITION BY HASH(expression)
[subpartition_option] PARTITIONS partition_count
| PARTITION BY KEY([column_name_list])
[subpartition_option] PARTITIONS partition_count
| PARTITION BY RANGE {(expression) | COLUMNS (column_name_list)}
[subpartition_option] (range_partition_list)
subpartition_option:
SUBPARTITION BY HASH(expression)
SUBPARTITIONS subpartition_count
| SUBPARTITION BY KEY(column_name_list)
SUBPARTITIONS subpartition_count
| SUBPARTITION BY RANGE {(expression) | COLUMNS (column_name_list)}
(range_subpartition_list)
storage_cache_policy_option:
GLOBAL = {"hot" | "auto" | "none"}
| timeline_strategy_list
timeline_strategy_list:
BOUNDARY_COLUMN = column_name [,BOUNDARY_COLUMN_UNIT = {"s"| "ms"}] ,HOT_RETENTON = intnum retention_time_unit
retention_time_unit:
YEAR
| MONTH
| WEEK
| DAY
| HOUR
| MINUTE
split_range_partition_list:
PARTITION split_partition_name VALUES LESS THAN (value)
[, PARTITION split_partition_name VALUES LESS THAN (value) ...]
, PARTITION split_partition_name VALUES LESS THAN (source_value)
range_partition_list:
range_partition [, range_partition ...]
range_partition:
PARTITION partition_name
VALUES LESS THAN {(expression_list) | MAXVALUE}
[STORAGE_CACHE_POLICY = {"hot" | "auto" | "none"}]
range_subpartition_list:
range_subpartition [, range_subpartition ...]
range_subpartition:
SUBPARTITION subpartition_name
VALUES LESS THAN {(expression_list) | MAXVALUE}
[STORAGE_CACHE_POLICY = {"hot" | "auto" | "none"}]
expression_list:
expression [, expression ...]
column_name_list:
column_name [, column_name ...]
partition_name_list:
partition_name [, partition_name ...]
partition_count | subpartition_count:
INT_VALUE
add_subpartition_option:
{SUBPARTITION subpartition_name VALUES LESS THAN range_partition_expr
[, SUBPARTITION subpartition_name VALUES LESS THAN range_partition_expr] ...}
| {SUBPARTITION subpartition_name VALUES IN list_partition_expr
[, SUBPARTITION subpartition_name VALUES IN list_partition_expr] ...}
パラメータ説明
パラメータ |
説明 |
|---|---|
| ADD [COLUMN] | 列を追加します。生成列の追加もサポートしています。 |
| [FIRST | BEFORE | AFTER column_name] | 新規列をテーブルの最初の列として、または column_name 列の前後に配置します。現在、OceanBaseデータベースでは ADD COLUMN 構文でのみ列の位置設定がサポートされています。 |
| CHANGE [COLUMN] | 列名と列定義を変更します。特定の文字データ型(VARCHAR、VARBINARY、CHAR など)の長さのみを増やすことができます。 |
| MODIFY [COLUMN] | 列属性を変更します。 |
| ALTER [COLUMN] {SET DEFAULT const_value | DROP DEFAULT} | 列のデフォルト値を変更します。 |
| DROP [COLUMN] | 列を削除します。
注意主キー列の削除は許可されません。 |
| ADD FOREIGN KEY | 外部キーを追加します。外部キー名を指定しない場合、テーブル名 + OBFK + 作成日時が使用されます(例:2021年8月1日00:00:00に t1 テーブルに作成された外部キーの名前は t1_OBFK_1627747200000000 です)。外部キーはテーブル間で関連データを相互参照することを可能にします。UPDATE または DELETE 操作が子テーブルと一致する行の親テーブルのキー値に影響を与える場合、その結果は ON UPDATE および ON DELETE 句の参照操作によって決まります:
SET DEFAULT 操作もサポートしています。 |
| ADD PRIMARY KEY | 主キーを追加します。1つ以上の列を主キーとして指定できます。複数の列を指定した場合、それらは複合主キーを形成します。 |
| ADD FULLTEXT [INDEX | KEY] | 全文インデックスを追加します。全文インデックスの作成方法については、インデックスの作成 の「全文インデックス」セクションを参照してください。 |
| WITH PARSER tokenizer_option | オプションです。全文インデックスのトークナイザーを指定します。詳細については、以下の tokenizer_option を参照してください。 |
| PARSER_PROPERTIES[=](parser_properties_list) | オプションです。トークナイザーのプロパティを指定します。詳細については、以下の parser_properties を参照してください。 |
| ALTER INDEX | インデックスの可視性を変更します。インデックスの状態が INVISIBLE の場合、SQLオプティマイザーはそのインデックスを選択しません。 |
| key_part | (関数)インデックスを作成します。 |
| index_col_name | インデックスを作成する列名を指定します。各列名の後にはASC(昇順)を指定できますが、DESC(降順)はサポートされていません。デフォルトは昇順です。インデックスのソート方式は以下のとおりです:まず、index_col_name の最初の列の値でソートします。その列の値が同じ場合、次の列名の値でソートし、以降も同様に処理を繰り返します。 |
| expr | 有効な関数インデックス式を表します。ブール式も指定可能です。例:c1=c1。注意 OceanBase データベースの現在のバージョンでは、生成列に対する関数インデックスの作成は禁止されています。 |
| ADD [PARTITION] | パーティションテーブルにパーティションを追加します。 |
| DROP {PARTITION | SUBPARTITION} | パーティションの削除:
注意 パーティションを削除する際は、そのパーティション上でアクティブなトランザクションやクエリがないようにしてください。そうでない場合、SQL文がエラーになったり、異常が発生したりする可能性があります。 |
| TRUNCATE {PARTITION | SUBPARTITION} | パーティションデータの削除:
注意 パーティションデータを削除する際は、そのパーティション上でアクティブなトランザクションやクエリがないようにしてください。そうでない場合、SQL文がエラーになったり、異常が発生したりする可能性があります。 |
| RENAME COLUMN old_col_name [TO|AS] new_col_name | 列名を変更します。列の定義は変更せず、列名のみを変更します。
注意
|
| RENAME [TO|AS] table_name | テーブルの名前を変更します。
注意
|
| RENAME [TO] table_name | テーブルの名前を変更します。
注意
|
| RENAME {INDEX | KEY} | インデックスまたはキーの名前を変更します。 |
| DROP [TABLEGROUP] | テーブルグループを削除します。 |
| DROP [FOREIGN KEY] | 外部キーを削除します。 |
| DROP [PRIMARY KEY] | 主キーを削除します。
説明MySQLモードでは、以下の場合は主キーの削除を許可しません:
|
| [SET] table_option | テーブルレベルのプロパティを設定します。以下のパラメータが利用可能です:
|
| CHECK | CHECK 制約を変更します。以下の操作をサポートします:
|
| [NOT] ENFORCED | constraint_name という名前の CHECK 制約を強制実行するかどうかを指定します。
|
| ADD COLUMN GROUP([all columns, ]each column) [DELAYED] | テーブルをカラムストアテーブルに変更します。詳細は以下のとおりです:
|
| DROP COLUMN GROUP([all columns, ]each column) | テーブルのストレージ形式を削除します。詳細は以下のとおりです:
|
| index_column_group_option | インデックスオプションを指定します。詳細は以下のとおりです:
|
| SKIP_INDEX | 列のSkip Indexプロパティを変更します。値は以下のとおりです:
注意
|
| EXCHANGE PARTITION partition_name WITH TABLE origin_table_name | パーティションの交換を指定します。ここで、partition_name はパーティション交換におけるパーティションテーブルのパーティション名を表します。origin_table_name はパーティション交換におけるソーステーブル名で、非パーティションテーブルまたはパーティションテーブルのパーティション1を表します。パーティション交換の詳細については、パーティション交換を参照してください。 |
| TABLE_MODE | オプションです。メジャーコンパクションのトリガーしきい値とメジャーコンパクションポリシーを指定するために使用され、データダンプ後のメジャーコンパクション動作を制御します。値の詳細については、以下の table_mode_value を参照してください。 |
| AUTO_INCREMENT_CACHE_SIZE | キャッシュされる自動インクリメント値の数を設定します。このパラメータのデフォルト値は0で、この項目が構成されていないことを意味します。システムはテナントレベルの構成パラメータ(auto_increment_cache_sizeを自動インクリメント列のキャッシュサイズの設定として使用します。 |
| READ {ONLY | WRITE} | テーブルの読み書き権限を指定します。具体的には以下のとおりです:
|
| DUPLICATE_SCOPE | レプリケーションテーブルの属性を変更するために使用します。
|
| enable_macro_block_bloom_filter [=] {True | False} | マクロブロックレベルのブルームフィルターを永続化するかどうかを指定します。値は以下のとおりです:
|
| DYNAMIC_PARTITION_POLICY [=] (dynamic_partition_policy_list) | テーブルの動的パーティション管理属性を変更します。dynamic_partition_policy_list は動的パーティションポリシーの構成可能なパラメータリストで、各パラメータは半角カンマで区切られます。詳細については、以下の dynamic_partition_policy_option を参照してください。 |
| REORGANIZE PARTITION | パーティションの手動分割に使用します。関連パラメータは以下のとおりです:
注意OceanBaseデータベースのMySQLモードでは、現在のバージョンでは1つのパーティションを複数のパーティションに分割することはサポートされていますが、複数のパーティションを複数のパーティションに分割することはサポートされていません。 |
| PARTITION BY | テーブルの自動パーティションの属性を変更したり、パーティションルールを変更したりするために使用します。関連パラメータは以下のとおりです:
|
| MODIFY PARTITION partition_name ADD SUBPARTITION (add_subpartition_option) | 2次サブパーティションを追加することを示します。
注意HashまたはKeyタイプの2次サブパーティションには、新しい2次サブパーティションを追加することはサポートされていません。 |
| add_subpartition_option | 新規追加される2次サブパーティションの定義を示します。 |
| range_partition_expr | Range/Range Columnsパーティションの式を示します。 |
| list_partition_expr | List/List Columnsパーティションの式を示します。 |
| FORCE | 廃棄された列をクリアします。
説明一部の列が削除された場合、それらの列が使用されなくなっても物理ストレージ容量を占有し続けます。これらの廃棄された列を削除して関連する容量を回収するには、廃棄された列をクリアする必要があります。 |
| SEMISTRUCT_ENCODING_TYPE | オプションです。半構造化エンコーディングのタイプを指定するために使用します。具体的には以下のとおりです:
注意V4.4.1バージョン以降、 |
| SEMISTRUCT_PROPERTIES | オプションです。半構造化エンコーディングタイプを指定するために使用します。キーと値のペアで記述します。詳細は以下のとおりです:
機能の使用方法については、半構造化エンコーディングの使用を参照してください。 注意このパラメータはV4.4.1バージョンからサポートされています。 |
| STORAGE_CACHE_POLICY | オプションです。共有ストレージモードで、テーブルやインデックスのホットキャッシュポリシーを指定するために使用します。詳細については、以下の storage_cache_policy を参照してください。 |
| ALTER {PARTITION | SUBPARTITION} partition_name STORAGE_CACHE_POLICY | 共有ストレージモードで、パーティションのホットキャッシュポリシーを指定するために使用します。詳細については、以下の partition_storage_cache_policy を参照してください。 |
table_mode_value
説明
以下にリストされている TABLE_MODE モードでは、NORMAL モードを除くすべてのモードが QUEUING テーブルを表します。この QUEUING テーブルは最も基本的なテーブルタイプであり、その後にリストされているいくつかのモード(NORMALモードを除く)は、より積極的なメジャーコンパクション戦略の使用を表しています。
NORMAL:デフォルト値で、通常を表します。このモードでは、データダンプ後にメジャーコンパクションがトリガーされる確率は非常に低いです。QUEUING:このモードでは、データダンプ後にメジャーコンパクションがトリガーされる確率は低いです。MODERATE:適度を表します。このモードでは、データダンプ後にメジャーコンパクションがトリガーされる確率は中程度です。SUPER:スーパーを表します。このモードでは、データダンプ後にメジャーコンパクションがトリガーされる確率は高いです。EXTREME:極端を表します。このモードでは、ダンプ後にメジャーコンパクションがトリガーされる確率はさらに高いです。
メジャーコンパクションの詳細については、アダプティブコンパクションを参照してください。
tokenizer_option
SPACE:デフォルト値で、スペースによる分かち書きを表します。以下のプロパティを指定できます:プロパティ値の範囲min_token_size [1, 16] max_token_size [10, 84] NGRAM:N-Gram(中国語)に基づく分かち書き方式を表します。以下のプロパティを指定できます:プロパティ値の範囲ngram_token_size [1, 10] NGRAM2:テキストをmin_ngram_size~max_ngram_sizeの範囲の連続する文字に分割します。以下のプロパティを指定できます:プロパティ値の範囲min_ngram_size [1, 16] max_ngram_size [1, 16] BENG:Beng(基本英語)に基づく分かち書き方式を表します。以下のプロパティを指定できます:プロパティ値の範囲min_token_size [1, 16] max_token_size [10, 84] IK:IK(中国語)に基づく分かち書き方式を表します。現在はutf-8文字セットのみをサポートしています。以下のプロパティを指定できます:プロパティ値の範囲ik_mode smartmax_word
TOKENIZE 関数を使用すると、指定されたトークナイザーおよびJSON形式のパラメータに従ってテキストを分かち書きした結果を確認できます。
parser_properties
min_token_size:最小トークンサイズを表します。デフォルト値は3で、取り得る範囲は1から16です。max_token_size:最大トークンサイズを表します。デフォルト値は84で、取り得る範囲は10から84です。ngram_token_size:NGRAMのトークンサイズを表します。NGRAMトークナイザーでのみ有効です。デフォルト値は2で、取り得る範囲は1から10です。ik_mode:IKトークナイザーのトークン化モードを表します。取り得る値は以下のとおりです:smart:デフォルト値。辞書にある単語を使用してトークン化の精度を向上させます。辞書内の単語境界が優先的に考慮されるため、不要な拡張が減少する可能性があります。max_word:辞書で定義された単語は認識されますが、トークン化の最大化拡張には影響しません。辞書に定義があっても、max_wordモードはテキストをより多くの単語に分割しようと試みます。
min_ngram_size:最小トークンサイズを表します。取り得る範囲は[1,16]です。max_ngram_size: 最大トークンサイズを表します。取り得る範囲は[1,16]です。
例:
テーブル
tbl1を作成します。CREATE TABLE tbl1 (col1 VARCHAR(200), col2 TEXT);テーブル
tbl1に全文インデックスfidxを追加します。ALTER TABLE tbl1 ADD FULLTEXT INDEX fidx(col2) WITH PARSER ik PARSER_PROPERTIES=(ik_mode='max_word');
dynamic_partition_policy_option
ENABLE = {true | false}:動的パーティション管理を有効にするかどうかを表します。取り得る値は以下のとおりです:true:デフォルト値。動的パーティション管理を有効にします。false:動的パーティション管理を無効にします。
PRECREATE_TIME = {'-1' | '0' | 'n {hour | day | week | month | year}'}:事前作成時間を表します。動的パーティション管理を1回スケジュールするごとに、パーティションを事前作成し、最大パーティション上界 > now() + precreate_time となるようにします。取り得る値は以下のとおりです:-1:デフォルト値。パーティションを事前作成しません。0:現在のパーティションのみを事前作成します。n {hour | day | week | month | year}:指定された時間幅のパーティションを事前作成します。例えば、3 hourは3時間以内のパーティションを事前作成することを意味します。
説明
- 複数のパーティションを事前作成する必要がある場合、パーティション境界間の間隔は
TIME_UNITです。 - 最初に事前作成されるパーティションの境界は、既存の最大パーティション境界を
TIME_UNITで切り上げた値となります。
EXPIRE_TIME = {'-1' | '0' | 'n {hour | day | week | month | year}'}:オプションです。パーティションの有効期限を表します。動的パーティション管理を1回スケジュールするごとに、パーティション上界 < now() - expire_time のすべての期限切れパーティションを削除します。変更可能で、取り得る値は以下のとおりです:-1:デフォルト値。パーティションは永遠に期限切れになりません。0:現在のパーティションを除き、それ以前のすべてのパーティションが期限切れになります。n {hour | day | week | month | year}:パーティションの有効期限を表します。例えば、1 dayはパーティションの有効期限が1日であることを意味します。
動的パーティションテーブルの変更に関する詳細は、動的パーティションテーブルの変更を参照してください。
例:
ALTER TABLE tbl2 SET DYNAMIC_PARTITION_POLICY(
ENABLE = true,
PRECREATE_TIME = '1 day',
EXPIRE_TIME = '-1'
);
storage_cache_policy
storage_cache_policy_option の各プロパティはキーと値の形式で定義されます。各プロパティの意味は以下のとおりです:
GLOBAL = {"hot" | "auto"| "none"}:テーブル全体のデータに対するホットキャッシュポリシーを指定します。取り得る値は以下のとおりです:hot:指定したテーブルのすべてのデータがホットデータであることを意味します。キャッシュ用のディスク容量に余裕がある場合、テーブル内のすべてのデータがローカルのクラウドディスクにキャッシュされます。auto:指定したテーブルのホットデータはシステムが自動的に認識することを意味します。none:このインデックスのポリシーがメインテーブルのSTORAGE_CACHE_POLICYの値に従うことを意味します。注意
noneプロパティはインデックスにのみ使用できます。
timeline_strategy_list:タイムライン戦略パラメータリストを表します。各パラメータは半角カンマで区切られます。ホットキャッシュのタイムライン戦略は、時間を基準にパーティションデータがホットデータかどうかを判断するメカニズムをサポートしており、システムは設定された戦略に基づいて、ローカルキャッシュディスク上のパーティションデータを自動的に調整します。説明
タイムライン:Rangeパーティションで定義されたパーティション範囲の値に基づいてホットデータをキャッシュします。一定の時間条件を満たすと、そのパーティションのデータはホットデータと判断されます。タイムライン戦略を使用する際には、以下の点に注意する必要があります:
- Rangeパーティションテーブルのみが使用できます(Rangeパーティションは1次または2次でも構いません)。期限切れの判断に時間がかかるためですが、ダブルRangeパーティションは、どちらのRangeパーティションの時間を基準にするか判断できないため使用できません。
- タイムラインを使用する場合、パーティション式には列名のみを含めることができ、式の変換はサポートされません。例えば、
PARTITION BY RANGE COLUMNS(expr(col3))は使用できません。 BOUNDARY_COLUMNはパーティションキーでなければなりません。パーティションキーが複数列ある場合、BOUNDARY_COLUMNは最初の列でなければならず、これによりパーティションが期限切れかどうかを判断します。
BOUNDARY_COLUMN = column_name:ホットデータを判断する列を指定します。整数型(BIGINTまたはINT型、Unixタイムスタンプ形式)と時刻型(TIMESTAMP、DATE、DATETIMEまたはYEAR型)をサポートします。BOUNDARY_COLUMNの型が整数型の場合、テーブルのパーティション方式は Range/Range Columns パーティションタイプをサポートします。BOUNDARY_COLUMNの型が時刻型の場合、テーブルのパーティション方式は Range Columns パーティションタイプのみを使用できます。
BOUNDARY_COLUMN_UNIT = {"s" | "ms"}:パラメータBOUNDARY_COLUMNの時間単位を指定します。このパラメータはBOUNDARY_COLUMNが整数型の場合にのみ設定できます。整数値をタイムスタンプとして使用する場合は、タイムスタンプの単位を指定する必要があります。そうでない場合、誤った時間が解釈される可能性があります。取り得る値は以下のとおりです:パーティション列が
INT型の場合、BOUNDARY_COLUMN_UNITの値はsのみとなります。パーティション列が
BIGINT型の場合、BOUNDARY_COLUMN_UNITの値はsまたはmsとなります。注意
形式がUnixタイムスタンプでない場合、
INT型で表される時間を正しく認識できません。
HOT_RETENTION = intnum retention_time_unit:ホットデータの時間範囲を設定します。intnum:整数を表します。retention_time_unit:時間単位を表します。取り得る値は以下のとおりです:YEAR:年を表します。MONTH:月を表します。WEEK:週を表します。DAY:日を表します。HOUR:時間を表します。MINUTE:分を表します。
partition_storage_cache_policy
STORAGE_CACHE_POLICY = {"hot" | "auto" | "none"}:パーティションのデータがホットデータかどうかを指定します。取り得る値は以下のとおりです:hot:指定したパーティションをホットストレージとして扱います。キャッシュ用ディスク容量に余裕がある場合、そのパーティションのすべてのデータがローカルのクラウドディスクにキャッシュされます。auto:指定したパーティションのホットデータをシステムが自動的に識別します。none:デフォルト値で、このパーティションのポリシーがマスターテーブルのSTORAGE_CACHE_POLICYの値に従うことを示します。
例
列の追加と削除の操作
サンプルテーブル tbl1 を作成し、DESCRIBE コマンドを実行してテーブル情報を確認します。
obclient> CREATE TABLE tbl1 (c1 INT(11) PRIMARY KEY,c2 VARCHAR(50));
Query OK, 0 rows affected
obclient> DESCRIBE tbl1;
+-------+------------+----------+--------+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+----------+--------+---------+-------+
| c1 | int(11) | NO | PRI | NULL | |
| c2 | varchar(50)| YES | | NULL | |
+-------+------------+----------+--------+---------+-------+
c3列を追加し、DESCRIBEコマンドを実行してテーブル情報を確認します。obclient> ALTER TABLE tbl1 ADD c3 INT; Query OK, 1 row affected obclient> DESCRIBE tbl1; +-------+------------+----------+--------+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+----------+--------+---------+-------+ | c1 | int(11) | NO | PRI | NULL | | | c2 | varchar(50)| YES | | NULL | | | c3 | int(11) | YES | | NULL | | +-------+------------+----------+--------+---------+-------+ 3 row affectedc3列を削除し、DESCRIBEコマンドを実行してテーブル情報を確認します。obclient> ALTER TABLE tbl1 DROP c3; Query OK, 1 row affected obclient> DESCRIBE tbl1; +-------+------------+----------+--------+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+----------+--------+---------+-------+ | c1 | int(11) | NO | PRI | NULL | | | c2 | varchar(50)| YES | | NULL | | +-------+------------+----------+--------+---------+-------+ 2 row affectedテーブル
tbl1のフィールドc2の名前をc3に変更し、DESCRIBEコマンドを実行してテーブル情報を確認します。obclient> ALTER TABLE tbl1 CHANGE COLUMN c2 c3 VARCHAR(50); Query OK, 1 row affected obclient> DESCRIBE tbl1; +-------+------------+----------+--------+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+----------+--------+---------+-------+ | c1 | int(11) | NO | PRI | NULL | | | c3 | varchar(50)| YES | | NULL | | +-------+------------+----------+--------+---------+-------+ 2 rows affectedテーブル
tbl1にc4列を追加し、この列をテーブルの1番目の列に設定して、DESCRIBEコマンドを実行してテーブル情報を確認します。obclient> ALTER TABLE tbl1 ADD COLUMN c4 INTEGER FIRST; Query OK, 1 row affected obclient> DESCRIBE tbl1; +-------+------------+----------+--------+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+----------+--------+---------+-------+ | c4 | int(11) | YES | | NULL | | | c1 | int(11) | NO | PRI | NULL | | | c3 | varchar(50)| YES | | NULL | | +-------+------------+----------+--------+---------+-------+ 3 row affectedc1列の後にc2列を追加し、DESCRIBEコマンドを実行してテーブル情報を確認します。obclient> ALTER TABLE tbl1 ADD COLUMN c2 INTEGER AFTER c1; Query OK, 1 row affected obclient> DESCRIBE tbl1; +-------+------------+----------+--------+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+----------+--------+---------+-------+ | c4 | int(11) | YES | | NULL | | | c1 | int(11) | NO | PRI | NULL | | | c2 | int(11) | YES | | NULL | | | c3 | varchar(50)| YES | | NULL | | +-------+------------+----------+--------+---------+-------+ 4 row affectedc4列の前にc5列を追加し、DESCRIBEコマンドを実行してテーブル情報を確認します。obclient> ALTER TABLE tbl1 ADD COLUMN c5 INT BEFORE c4; Query OK, 1 row affected obclient> DESCRIBE tbl1; +-------+------------+----------+--------+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+----------+--------+---------+-------+ | c5 | int(11) | YES | | NULL | | | c4 | int(11) | YES | | NULL | | | c1 | int(11) | NO | PRI | NULL | | | c2 | int(11) | YES | | NULL | | | c3 | varchar(50)| YES | | NULL | | +-------+------------+----------+--------+---------+-------+ 5 row affectedテーブル
tbl2に外部キー制約fk1を追加します。UPDATE操作が子テーブルと一致する行の親テーブルのキー値に影響を与えた場合、SET NULL操作を実行します。obclient> CREATE TABLE tbl2(c1 INT PRIMARY KEY,c2 INT); Query OK, 0 row affected obclient> CREATE TABLE tbl3(c1 INT PRIMARY KEY,c2 INT); Query OK, 0 row affected obclient> ALTER TABLE tbl2 ADD CONSTRAINT fk1 FOREIGN KEY (c2) REFERENCES tbl3(c1) ON UPDATE SET NULL; Query OK, 0 row affectedテーブル
tbl3の外部キー制約fk1を削除します。obclient> ALTER TABLE tbl2 DROP FOREIGN KEY fk1; Query OK, 0 row affectedテーブル
tbl2の主キーを削除します。obclient> ALTER TABLE tbl2 DROP PRIMARY KEY; Query OK, 0 row affected
インデックス操作
テーブル
tbl2のインデックスind1をind2に名前を変更します。obclient> CREATE TABLE tbl2(c1 INT(11) PRIMARY KEY,c2 INT(50)); Query OK, 0 row affected obclient> CREATE INDEX ind1 ON tbl2 (c2 ASC); Query OK, 0 row affected obclient> ALTER TABLE tbl2 RENAME INDEX ind1 TO ind2; Query OK, 0 row affectedテーブル
tbl2にインデックスind3を作成し、c1列とc2列を参照します。obclient> ALTER TABLE tbl2 ADD INDEX ind3 (c1,c2); Query OK, 0 row affectedSHOW INDEXステートメントで作成したインデックスを確認できます。obclient> SHOW INDEX FROM tbl2; +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+ | tbl2 | 0 | PRIMARY | 1 | c1 | A | NULL | NULL | NULL | | BTREE | available | | YES | | tbl2 | 1 | ind2 | 1 | c2 | A | NULL | NULL | NULL | YES | BTREE | available | | YES | | tbl2 | 1 | ind3 | 1 | c1 | A | NULL | NULL | NULL | | BTREE | available | | YES | | tbl2 | 1 | ind3 | 2 | c2 | A | NULL | NULL | NULL | YES | BTREE | available | | YES | +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+ 4 rows in setテーブル
tbl2のインデックスind2を削除します。obclient> ALTER TABLE tbl2 DROP INDEX ind2; Query OK, 0 row affected説明
実際の運用シナリオでは、上記の方法でインデックスの原子的な変更を実現できます。
t1_funcに3つの関数インデックスを追加します。そのうち1つの名前はi2で、残りの2つはシステムが自動生成する名前で、functional_indexプレフィックスに番号を付けた形式です。obclient> ALTER TABLE t1_func ADD INDEX ((CONCAT(c1,'a'))); Query OK, 0 rows affected obclient> ALTER TABLE t1_func ADD INDEX ((c1+1)); Query OK, 0 rows affected obclient> ALTER TABLE t1_func ADD INDEX i2 ((CONCAT(c1,'a'))); Query OK, 0 rows affected obclient> SHOW CREATE TABLE t1_func; +---------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +---------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | t1_func | CREATE TABLE `t1_func` ( `c1` int(11) DEFAULT NULL, `c2` int(11) DEFAULT NULL, KEY `i1` (((`c1` + `c2`) < 1)) BLOCK_SIZE 16384 LOCAL, KEY `functional_index` (concat(`c1`,'a')) BLOCK_SIZE 16384 LOCAL, KEY `functional_index_2` ((`c1` + 1)) BLOCK_SIZE 16384 LOCAL, KEY `i2` (concat(`c1`,'a')) BLOCK_SIZE 16384 LOCAL ) DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = 'zstd_1.3.8' REPLICA_NUM = 1 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0 | +---------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in setテーブルにカラムストアインデックスを作成します。
以下のSQLステートメントを使用してテーブル
tbl3を作成します。CREATE TABLE tbl3 (col1 INT, col2 VARCHAR(50));テーブル
tbl3にカラムストアインデックスidx1_tbl3を作成し、col1列を参照します。ALTER TABLE tbl3 ADD INDEX idx1_tbl3 (col1) WITH COLUMN GROUP(each column);
インデックスを不可視に変更します。
説明
インデックスを不可視に設定すると、テーブル構造内で
/*!80000 INVISIBLE */マークが表示されます。テーブル
tbl4を作成します。CREATE TABLE tbl4 (col1 INT PRIMARY KEY, col2 INT, col3 INT);インデックス
idx1_tbl4を作成します。CREATE INDEX idx1_tbl4 ON tbl4(col2);インデックス
idx1_tbl4を不可視に変更します。ALTER TABLE tbl4 ALTER INDEX idx1_tbl4 INVISIBLE;再度テーブル
tbl4の構造を確認します。SHOW CREATE TABLE tbl4;実行結果は次のとおりです:
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | tbl4 | CREATE TABLE `tbl4` ( `col1` int(11) NOT NULL, `col2` int(11) DEFAULT NULL, `col3` int(11) DEFAULT NULL, PRIMARY KEY (`col1`), KEY `idx1_tbl4` (`col2`) BLOCK_SIZE 16384 LOCAL /*!80000 INVISIBLE */ ) DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = 'zstd_1.3.8' REPLICA_NUM = 1 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0 WITH COLUMN GROUP(each column) | +-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set
パーティション操作
パーティションテーブル
t_log_part_by_rangeのパーティションM202001とM202002のすべてのデータを削除します。obclient> CREATE TABLE t_log_part_by_range ( log_id bigint NOT NULL , log_value varchar(50) , log_date timestamp NOT NULL ) PARTITION BY RANGE(UNIX_TIMESTAMP(log_date)) ( PARTITION M202001 VALUES LESS THAN(UNIX_TIMESTAMP('2020/02/01')) , PARTITION M202002 VALUES LESS THAN(UNIX_TIMESTAMP('2020/03/01')) , PARTITION M202003 VALUES LESS THAN(UNIX_TIMESTAMP('2020/04/01')) , PARTITION M202004 VALUES LESS THAN(UNIX_TIMESTAMP('2020/05/01')) , PARTITION M202005 VALUES LESS THAN(UNIX_TIMESTAMP('2020/06/01')) ); Query OK, 0 rows affected obclient> ALTER TABLE t_log_part_by_range TRUNCATE PARTITION M202001, M202002; Query OK, 0 rows affectedパーティションテーブル
t_log_part_by_rangeにパーティションM202006を追加します。obclient> CREATE TABLE t_log_part_by_range ( log_id bigint NOT NULL , log_value varchar(50) , log_date timestamp NOT NULL ) PARTITION BY RANGE(UNIX_TIMESTAMP(log_date)) ( PARTITION M202001 VALUES LESS THAN(UNIX_TIMESTAMP('2020/02/01')) , PARTITION M202002 VALUES LESS THAN(UNIX_TIMESTAMP('2020/03/01')) , PARTITION M202003 VALUES LESS THAN(UNIX_TIMESTAMP('2020/04/01')) , PARTITION M202004 VALUES LESS THAN(UNIX_TIMESTAMP('2020/05/01')) , PARTITION M202005 VALUES LESS THAN(UNIX_TIMESTAMP('2020/06/01')) ); Query OK, 0 rows affected obclient> ALTER TABLE t_log_part_by_range ADD PARTITION (PARTITION M202006 VALUES LESS THAN(UNIX_TIMESTAMP('2020/07/01')) );
パラレル度の変更
テーブル
tbl3のパラレル度を2に変更します。obclient> ALTER TABLE tbl3 PARALLEL 2;テーブルのパラレル度は
ALTER TABLE table_name PARALLEL int;を使用して変更できるほか、PARALLELヒントを使用して変更することもできます。構文はalter /*+ parallel(int) */ tableです。
列型関連の操作
テーブル
tbl4の通常列col1を自動インクリメント列に変更します。obclient> CREATE TABLE tbl4 (col1 BIGINT(10) NOT NULL,col2 INT); Query OK, 0 rows affected obclient> ALTER TABLE tbl4 MODIFY col1 BIGINT(10) AUTO_INCREMENT; Query OK, 0 rows affectedテーブル
tbl4に主キーcol1を追加し、その後主キーをcol2に変更します。obclient> ALTER TABLE tbl4 ADD PRIMARY KEY (col1); Query OK, 0 rows affected obclient> ALTER TABLE tbl4 DROP PRIMARY KEY,ADD PRIMARY KEY (`col2`); Query OK, 0 rows affectedCHECK制約を追加します。obclient> CREATE TABLE tbl7(col1 VARCHAR(10),col2 VARCHAR(10)); Query OK, 0 rows affected obclient> ALTER TABLE tbl7 ADD CONSTRAINT my_check CHECK (col1> col2) ; Query OK, 0 rows affectedテーブル
tbl7のCHECK制約を削除します。obclient> ALTER TABLE tbl7 DROP CHECK my_check; Query OK, 0 rows affected列型を
NOT NULLに変更します。obclient> CREATE TABLE dept( deptno NUMBER(2,0), dname VARCHAR(14), location VARCHAR(13), CONSTRAINT pk_dept PRIMARY KEY(deptno) ); Query OK, 0 rows affected obclient> CREATE TABLE emp( empno NUMBER(4,0) NOT NULL, empname VARCHAR(10) NOT NULL, job VARCHAR(9) NOT NULL, mgr NUMBER(4,0) NOT NULL, hiredate DATE NOT NULL, sal NUMBER(7,2) DEFAULT NULL, comm NUMBER(7,2) DEFAULT NULL, deptno NUMBER(2,0) DEFAULT NULL, CONSTRAINT PK_emp PRIMARY KEY (empno), CONSTRAINT FK_deptno FOREIGN KEY (deptno) REFERENCES dept (deptno) ); Query OK, 0 rows affected obclient> ALTER TABLE emp MODIFY deptno NUMBER(2,0) DEFAULT '12' NOT NULL; Query OK, 0 rows affected
列名の変更とNOT NULL列制約の追加を同時に行う
注意
列名の変更と not null 制約の追加を同時に行うには、以下の条件を満たす必要があります:
- 一度に変更できるのは、列名と制約のどちらか一方のみです。複数列に対する同時変更はサポートされていません。
not null制約の追加のみがサポートされています。- インデックスやパーティションなどの他の操作を含まない、
alter_columnのみの処理であること。 - 名前を変更する列と制約を追加する列は、同一の列である必要があります。
obclient> ALTER TABLE test_alter1 MODIFY COLUMN `C1` varchar(10) NOT NULL;
Query OK, 0 rows affected (2.421 sec)
2列に同時にNOT NULL制約を追加する
注意
2列に同時にNOT NULL制約を追加するには、以下の条件を満たす必要があります。
- 2列を超える列に制約を追加する操作はサポートされていません。
not null制約の追加のみがサポートされています。- インデックスやパーティションなどの他の操作を含まない、
alter_columnのみの処理であること。 - 制約を追加する2列以外の列を変更する操作はできません。
以下のコマンドを実行して、C1 列と c2 列に NOT NULL 制約を同時に追加します。
obclient> ALTER TABLE test_alter4 MODIFY COLUMN c1 varchar(10) NOT NULL, MODIFY COLUMN c2 varchar(10) NOT NULL;
Query OK, 0 rows affected (2.605 sec)
プレフィックスインデックスを持つ列の型を変更する
注意
プレフィックスインデックスを持つ列の型を変更するには、以下の条件を満たす必要があります。
- 元の列の型が
char型であること。 - ターゲット列の型が
varchar型であること。 - 元の列とターゲット列の長さが一致していること。
- 以下のコマンドを実行して、
test_alter5という名前のテーブルを作成します。このテーブルにはc1列が含まれ、データ型はCHAR(20)です。また、c1列にはidx_c1という名前のプレフィックスインデックスを作成します。
obclient> CREATE TABLE test_alter5 (c1 char(20), KEY idx_c1(c1(10)));
- 以下のコマンドを実行して、
c1列のデータ型をvarchar(20)に変更します。
obclient> ALTER TABLE test_alter5 MODIFY COLUMN c1 varchar(20);
外部キー制約ルールの変更
- 以下のコマンドを実行して、テーブル
t1を作成し、整数列c1に一意性制約を追加します。
obclient> CREATE TABLE t1(c1 int unique key);
- 以下のコマンドを実行して、整数列
c1を含むt2という名前のテーブルを作成し、外部キー制約を定義します。
obclient> CREATE TABLE t2(c1 int, CONSTRAINT fk_cst_test FOREIGN KEY (c1) REFERENCES t1(c1) on update set null on delete no action);
- 以下のコマンドを実行して、システムテーブル
INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTSをクエリし、外部キー制約fk_cst_testの更新および削除ルールを取得します。
obclient> SELECT update_rule, delete_rule FROM information_schema.referential_constraints WHERE CONSTRAINT_NAME = 'fk_cst_test';
実行結果は次のとおりです。
+-------------+-------------+
| update_rule | delete_rule |
+-------------+-------------+
| SET NULL | NO ACTION |
+-------------+-------------+
UPDATE_RULE:SET NULLを返します(更新時に外部キーをNULLに設定することを示します)。DELETE_RULE:NO ACTIONを返します(削除時に制約をチェックし、操作を阻止する可能性があることを示します)。
列の名前変更操作
RENAME COLUMNは列定義を変更せず、列名のみを変更します。ターゲット名がテーブル内に既に存在する場合、RENAME COLUMNの実行はエラーとなりますが、元の名前に戻す場合はエラーにはなりません。obclient> CREATE TABLE tbl8 (a INT, b INT); Query OK, 0 rows affected obclient> ALTER TABLE tbl8 RENAME COLUMN a TO b; ERROR 1060 (42S21): Duplicate column name 'b' obclient> ALTER TABLE tbl8 RENAME COLUMN a TO a; Query OK, 0 rows affected名前を変更する列にインデックスが作成されている場合、
RENAME COLUMNは正常に実行され、インデックス定義は自動的に連鎖的に変更されます。obclient> CREATE TABLE tbl9 (a INT, b INT, index idx_a(a)); Query OK, 0 rows affected obclient> SHOW INDEX FROM tbl9; +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression | +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+ | tbl9 | 1 | idx_a | 1 | a | A | NULL | NULL | NULL | YES | BTREE | available | | YES | NULL | +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+ 1 row in set obclient> ALTER TABLE tbl9 RENAME COLUMN a TO c; Query OK, 0 rows affected obclient> SHOW INDEX FROM tbl9; +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression | +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+ | tbl9 | 1 | idx_a | 1 | c | A | NULL | NULL | NULL | YES | BTREE | available | | YES | NULL | +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+ 1 row in set名前を変更する列がプレフィックスインデックスで参照されている場合、
RENAME COLUMNは正常に実行され、プレフィックスインデックスは連鎖的な変更をサポートします。DROP TABLE tbl9; obclient> CREATE TABLE tbl9 (c1 INT PRIMARY KEY, c2 BLOB, c3 INT, INDEX i1 (c2(10))); Query OK, 0 rows affected obclient> ALTER TABLE tbl9 RENAME COLUMN c2 TO c2_, RENAME COLUMN c1 TO c2_1; DESC tbl9; Query OK, 0 rows affected obclient> SHOW INDEX FROM tbl9; +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression | +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+ | tbl9 | 0 | PRIMARY | 1 | c2_1 | A | NULL | NULL | NULL | | BTREE | available | | YES | NULL | | tbl9 | 1 | i1 | 1 | c2_ | A | NULL | 10 | NULL | YES | BTREE | available | | YES | NULL | +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+ 2 rows in set名前を変更する列に外部キー制約がある場合、
RENAME COLUMNは正常に実行され、外部キー制約は自動的に連鎖的に変更されます。obclient> CREATE TABLE tbl10 (a INT PRIMARY KEY); Query OK, 0 rows affected obclient> CREATE TABLE tbl11(b INT, FOREIGN KEY (b) REFERENCES tbl10(a)); obclient> SHOW CREATE TABLE tbl11; +-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | tbl11 | CREATE TABLE `tbl11` ( `b` int(11) DEFAULT NULL, CONSTRAINT `tbl11_OBFK_1694681944513338` FOREIGN KEY (`b`) REFERENCES `test`.`tbl10`(`a`) ON UPDATE RESTRICT ON DELETE RESTRICT ) DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = 'zstd_1.3.8' REPLICA_NUM = 1 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0 | +-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set obclient> ALTER TABLE tbl10 RENAME COLUMN a TO c; Query OK, 0 rows affected obclient> SHOW CREATE TABLE tbl11; +-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | tbl11 | CREATE TABLE `tbl11` ( `b` int(11) DEFAULT NULL, CONSTRAINT `tbl11_OBFK_1694681944513338` FOREIGN KEY (`b`) REFERENCES `test`.`tbl10`(`c`) ON UPDATE RESTRICT ON DELETE RESTRICT ) DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = 'zstd_1.3.8' REPLICA_NUM = 1 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0 | +-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set
OceanBaseデータベースでは、以下のシナリオでは変更をサポートしておらず、また自動的な連鎖的変更も行いません:
名前を変更した列が生成列式で参照されている場合、列名の変更はサポートされず、実行時にエラーが発生します。
obclient> CREATE TABLE tbl12(a INT, b INT AS (a + 1), c INT, d INT, CONSTRAINT d_check CHECK(d > 0)) PARTITION BY HASH(c + 1) PARTITIONS 2; obclient> ALTER TABLE tbl12 RENAME COLUMN a TO e; ERROR 3108 (HY000): Column 'a' has a generated column dependency名前を変更した列がパーティション式で参照されている場合、列名の変更はサポートされず、実行時にエラーが発生します。
obclient> ALTER TABLE tbl12 RENAME COLUMN c TO e; ERROR 3855 (HY000): Column 'c' has a partitioning function dependency and cannot be dropped or renamed.名前を変更した列が
CHECK制約で参照されている場合、列名の変更はサポートされず、実行時にエラーが発生します。obclient> ALTER TABLE tbl12 RENAME COLUMN d TO e; ERROR 3959 (HY000): Check constraint 'd_check' uses column 'd', hence column cannot be dropped or renamed.名前を変更した列が関数インデックスで参照されている場合、列名の変更はサポートされず、実行時にエラーが発生します。
DROP TABLE IF EXISTS tbl12; obclient> CREATE TABLE tbl12(i INT, INDEX ((i+1))); Query OK, 0 rows affected obclient> ALTER TABLE tbl12 RENAME COLUMN i TO j; ERROR 3837 (HY000): Column 'i' has a functional index dependency and cannot be dropped or renamed.名前を変更した列がビューで参照されている場合、
RENAME COLUMNの実行は成功しますが、ビューへのクエリはエラーとなり、ユーザーがビュー定義を手動で変更する必要があります。obclient> CREATE TABLE tbl13(a INT); Query OK, 0 rows affected obclient> CREATE VIEW v1 AS SELECT a + 1 FROM tbl13; Query OK, 0 rows affected obclient> SELECT * FROM v1; Empty set obclient> ALTER TABLE tbl13 RENAME COLUMN a TO b; Query OK, 0 rows affected obclient> SELECT * FROM v1; ERROR 1356 (42S22): View 'test.v1' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them名前を変更した列がストアドプロシージャで参照されている場合、
RENAME COLUMNの実行は成功しますが、CALLProcedure はエラーとなり、ユーザーが手動で変更する必要があります。obclient> CREATE TABLE tbl14(a INT); Query OK, 0 rows affected obclient> CREATE PROCEDURE proc() SELECT a + 1 FROM tbl14; Query OK, 0 rows affected obclient> CALL proc(); Empty set obclient> ALTER TABLE tbl14 RENAME COLUMN a TO b; Query OK, 0 rows affected obclient> CALL proc(); ERROR 1054 (42S22): Unknown column 'a' in 'field list'
テーブルのカラムストア属性を変更する
- 以下のSQLステートメントを使用して、テーブル
tbl1を作成します。
CREATE TABLE tbl1 (col1 INT PRIMARY KEY, col2 VARCHAR(50));
- テーブル
tbl1の行ストア・カラムストア冗長テーブルに変更し、その後、行ストア・カラムストアの冗長属性を削除します。
ALTER TABLE tbl1 ADD COLUMN GROUP(all columns, each column);
ALTER TABLE tbl1 DROP COLUMN GROUP(all columns, each column);
- テーブル
tbl1のカラムストアテーブルに変更し、その後、カラムストア属性を削除します。
ALTER TABLE tbl1 ADD COLUMN GROUP(each column);
ALTER TABLE tbl1 DROP COLUMN GROUP(each column);
列のSkip Indexプロパティを変更する
以下のSQLステートメントを使用して、テーブル test_skidx を作成します。
CREATE TABLE test_skidx(
col1 INT SKIP_INDEX(MIN_MAX, SUM),
col2 FLOAT SKIP_INDEX(MIN_MAX),
col3 VARCHAR(1024) SKIP_INDEX(MIN_MAX),
col4 CHAR(10)
);
テーブル
test_skidxの列col2のSkip IndexプロパティをSUMSkip Indexタイプに変更します。ALTER TABLE test_skidx MODIFY COLUMN col2 FLOAT SKIP_INDEX(SUM);テーブル作成後に列のSkip Indexプロパティを追加します。テーブル
test_skidxの列col4にMIN_MAXSkip Indexタイプを追加します。ALTER TABLE test_skidx MODIFY COLUMN col4 CHAR(10) SKIP_INDEX(MIN_MAX);テーブル作成後に列のSkip Indexプロパティを削除します。テーブル
test_skidxの列col1のSkip Indexプロパティを削除します。ALTER TABLE test_skidx MODIFY COLUMN col1 INT SKIP_INDEX();または
ALTER TABLE test_skidx MODIFY COLUMN col1 INT;
テーブル属性の変更
永続化マクロブロックレベルのbloom filterを無効にするテーブルtbを作成します。
ALTER TABLE tb SET enable_macro_block_bloom_filter = False;
テーブルレベルSTORAGE_CACHE_POLICYの変更
テーブル
tbl1のホットキャッシュをシステムが自動的に識別するように変更します。ALTER TABLE tbl1 SET STORAGE_CACHE_POLICY (GLOBAL = "auto");テーブル
tbl2内で、col3によって判断された現在時刻から2か月以内のパーティションデータをホットデータとして扱います。ALTER TABLE tbl2 SET STORAGE_CACHE_POLICY (BOUNDARY_COLUMN = col3, HOT_RETENTION = 2 MONTH);
パーティションレベルのSTORAGE_CACHE_POLICYを変更する
テーブル
tbl3にパーティション p2 を追加します。パーティション p2 内でローカルディスクにキャッシュするホットデータは、システムが自動的に識別します。ALTER TABLE tbl3 ADD PARTITION (PARTITION p2 VALUES LESS THAN(300) STORAGE_CACHE_POLICY = "auto");テーブル
tbl3の既存のパーティション p1 内のデータをホットデータに変更します。ALTER TABLE tbl3 ALTER PARTITION p1 STORAGE_CACHE_POLICY = 'hot';テーブル
tbl4のサブパーティション sp3 内でローカルディスクにキャッシュするデータは、システムが自動的に識別します。ALTER TABLE tbl4 ALTER SUBPARTITON sp3 STORAGE_CACHE_POLICY = 'auto';