テーブル作成後、ALTER TABLE ステートメントを使用してテーブルを変更できます。
テーブルの照合順序と文字セットの変更
テーブル作成時に、テーブルのCollationと文字セットが明示的に定義されていない場合、データベースの文字セットと照合順序がデフォルトで使用されます。データベースのCollationと文字セットの詳細については、データベースレベルの文字セットと照合順序を参照してください。
テーブル作成後、テーブルのCollationと文字セット設定を変更できます。ステートメントは以下のとおりです:
ALTER TABLE table_name [[DEFAULT] CHARACTER SET [=] charset_name] [COLLATE [=] collation_name];
OceanBaseデータベースにおけるテーブルのCollationと文字セットの詳細については、テーブルレベルの文字セットと照合順序を参照してください。
注意
テーブルのCollationと文字セット設定を変更しても、既存の文字型列のデータ保存方法には影響しません。
例:
テーブル
tbl1を作成します。obclient> CREATE TABLE tbl1 (c1 int, c2 varchar(32), c3 varchar(32), PRIMARY KEY(c1), UNIQUE KEY uk1(c2));テーブルのCollationと文字セットを変更します。
obclient> ALTER TABLE tbl1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin;テーブルに既存のデータがある場合、そのデータのCollationと文字セットを変更し、テーブル全体のCollationと文字セットも対応する設定に変更できます。例:
obclient> ALTER TABLE tbl1 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
テーブル構造の変更
OceanBaseデータベースでは、列の追加、列およびその属性の変更、列の削除などがサポートされています。
列の追加
テーブルに列を追加しますが、主キー列は直接追加できません。主キー列を追加する必要がある場合は、まず列を追加し、その後にその列に主キーを設定します。主キーの追加に関する操作については、列の制約タイプの定義を参照してください。
test というテーブルがあると仮定します。そのテーブル構造は以下のとおりです。
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| c1 | int(11) | NO | PRI | NULL | |
| c2 | varchar(50) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set
任意の列
c3を追加します。obclient> ALTER TABLE test ADD c3 int;変更後、
DESCRIBE testステートメントを実行してテーブル構造を確認すると、結果は次のとおりです。+-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | c1 | int(11) | NO | PRI | NULL | | | c2 | varchar(50) | YES | | NULL | | | c3 | int(11) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 3 rows in setc1列の後にc4列を追加します。obclient> ALTER TABLE test ADD COLUMN c4 INT NULL AFTER c1;変更後、
DESCRIBE testステートメントを実行してテーブル構造を確認すると、結果は次のとおりです。+-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | c1 | int(11) | NO | PRI | NULL | | | c4 | int(11) | YES | | NULL | | | c2 | varchar(50) | YES | | NULL | | | c3 | int(11) | NO | | NULL | | +-------+-------------+------+-----+---------+-------+ 4 rows in setc1列の前にc6列を追加します。obclient> ALTER TABLE test ADD COLUMN c6 INT NULL BEFORE c1;変更後、
DESCRIBE testステートメントを実行してテーブル構造を確認すると、結果は次のとおりです。+-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | c6 | int(11) | YES | | NULL | | | c1 | int(11) | NO | PRI | NULL | | | c4 | int(11) | YES | | NULL | | | c2 | varchar(50) | YES | | NULL | | | c3 | int(11) | NO | | NULL | | +-------+-------------+------+-----+---------+-------+ 5 rows in set表示されるフィールドの説明は以下のとおりです:
Field:フィールド情報は列名です。Type:この列のデータ型です。Null:この列がNULLを許容するかどうかを示します。NOはNULLを許容しないことを意味し、YESはNULLを許容することを意味します。key:フィールド情報がPRIとして表示されている場合、その列は主キー列です。
列属性の変更
列の名前の変更、列型の変更、列のデフォルト値の変更、および列のSkip Index属性の変更をサポートします。
列の名前変更
RENAME COLUMN キーワードを使用して列を名前変更する際には、以下の点に注意してください:
名前変更対象の列にインデックスまたは外部キー制約がある場合、列名は正常に変更でき、インデックス定義と外部キー制約は自動的に連鎖して変更されます。
名前変更対象の列がビューまたはストアドプロシージャに参照されている場合、列名は正常に変更できますが、ビューまたはストアドプロシージャの定義を手動で変更する必要があります。
列の名前変更と列の削除を同時に行うことはサポートされていません。
列の名前変更とパーティションの変更(パーティションの追加、削除など)を同時に行うことはサポートされていません。
テーブル test があり、そのテーブル構造は以下のとおりです。
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| c1 | int(11) | NO | PRI | NULL | |
| c2 | varchar(50) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set
テーブル test の c2 列を c に名前変更する例を以下に示します。
obclient> ALTER TABLE test RENAME COLUMN c2 TO c;
変更後、DESCRIBE test ステートメントを実行してテーブル構造を確認すると、結果は次のとおりです。
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| c1 | int(11) | NO | PRI | NULL | |
| c | varchar(50) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set
以下のシナリオでは、列の名前変更は失敗します:
ターゲット列名が現在のテーブル内に既に存在する場合。
特別なシナリオとして、名前変更対象の列が循環参照している場合は、名前変更が可能です。例えば、この例では、元の
c1列をc2に名前変更し、同時に元のc2列をc1に名前変更するALTER TABLE test RENAME COLUMN c1 TO c2, rename column c2 TO c1;ステートメントを実行すると、名前変更が成功します。名前変更対象の列が生成列式によって参照されている場合。
名前変更対象の列がパーティション式によって参照されている場合。
名前変更対象の列がCHECK制約によって参照されている場合。
列型の変更
OceanBaseデータベースのMySQLモードにおける列型の変換ルールおよび詳細については、列型変更ルールを参照してください。
テーブル test があり、その構造は以下のとおりです。
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| c1 | int(11) | NO | PRI | NULL | |
| c2 | varchar(50) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set
テーブル test の c2 列をCHAR型に変更する例を以下に示します。
obclient> ALTER TABLE test MODIFY c2 CHAR(60);
変更後、DESCRIBE test ステートメントを実行してテーブル構造を確認した結果は次のとおりです。
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| c1 | int(11) | NO | PRI | NULL | |
| c2 | char(60) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set
列名と列型の同時変更
テーブル test があり、その構造は以下のとおりです。
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| c1 | int(11) | NO | PRI | NULL | |
| c2 | varchar(50) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set
テーブル test の c2 列を c に改名し、データ型を CHAR 型に変更する例を以下に示します。
obclient> ALTER TABLE test CHANGE COLUMN c2 c CHAR(60);
変更後、DESCRIBE test ステートメントを実行してテーブル構造を確認すると、結果は次のとおりです。
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| c1 | int(11) | NO | PRI | NULL | |
| c | char(60) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set
列のデフォルト値の変更
列の default 値を 2 に変更する例を以下に示します。
obclient> ALTER TABLE test CHANGE COLUMN c c2 varchar(50) DEFAULT 2;
変更後、DESCRIBE test ステートメントを実行してテーブル構造を確認すると、結果は次のとおりです。
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| c1 | int(11) | NO | PRI | NULL | |
| c2 | varchar(50) | YES | | 2 | |
+-------+-------------+------+-----+---------+-------+
2 rows in set
また、以下のステートメントで列のデフォルト値を変更することもできます。
ALTER TABLE table_name ALTER [COLUMN] column_name {SET DEFAULT const_value | DROP DEFAULT}
列のSkip Indexプロパティの変更
OceanBaseデータベースはALTER TABLEステートメントを使用して、Skip Indexプロパティの追加、変更、削除をサポートしています。
Skip Indexの詳細については、列の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;
列のCollationと文字セットの変更
列を追加する際に、各列の定義で文字セットと照合順序を指定しなかった場合、各列はデフォルトでテーブルの文字セットと照合順序を使用します。ビジネスニーズに応じて、各列のCollationと文字セット設定を変更できます。
テーブル tbl1 の作成ステートメントは以下のとおりです。
obclient> CREATE TABLE tbl1 (c1 int, c2 varchar(32), c3 varchar(32), PRIMARY KEY(c1), UNIQUE KEY uk1(c2));
テーブル tbl1 の c2 列のCollationを変更する例は以下のとおりです:
obclient> ALTER TABLE tbl1 MODIFY COLUMN c2 varchar(32) COLLATE utf8mb4_bin;
OceanBaseデータベースにおける列のCollationと文字セットの詳細については、列レベルの文字セットと照合順序を参照してください。
列の削除
テーブル内の通常列とインデックスを含む列の削除はサポートされていますが、主キー列の削除は許可されません。
test というテーブルがあると仮定します。そのテーブル構造は以下のとおりです。
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| c1 | int(11) | NO | PRI | NULL | |
| c | char(60) | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
2 rows in set
テーブル内の通常列の削除。
testというテーブルがあると仮定します。そのテーブル構造は以下のとおりです。+-------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+-------+ | c1 | int(11) | NO | PRI | NULL | | | c | char(60) | YES | | NULL | | +-------+----------+------+-----+---------+-------+ 2 rows in set以下のステートメントを実行して、
c列を削除します。obclient> ALTER TABLE test DROP c;削除後、
DESCRIBE testステートメントを実行してテーブル構造を確認すると、結果は次のとおりです。+-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | c1 | int(11) | NO | PRI | NULL | | +-------+---------+------+-----+---------+-------+ 1 row in setテーブル内のインデックスを含む列の削除。
testというテーブルがあると仮定します。そのテーブル構造は以下のとおりです。+-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | c1 | int(11) | NO | PRI | NULL | | | c2 | varchar(32) | YES | MUL | NULL | | | c3 | varchar(32) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 3 rows in set以下のステートメントを実行して、
c2列を削除します。obclient> ALTER TABLE test DROP c2;削除後、
DESCRIBE testステートメントを実行してテーブル構造を確認すると、結果は次のとおりです。+-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | c1 | int(11) | NO | PRI | NULL | | | c3 | varchar(32) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 2 rows in set
複数列の削除
複数列を削除するSQL構文は次のとおりです:
ALTER TABLE table_name DROP COLUMN column_name1, DROP COLUMN column_name2, ...;
例:
テストテーブル
test_tbl5を作成します。CREATE TABLE test_tbl5 ( col1 NUMBER(38), col2 VARCHAR(50), col3 NUMBER(38), col4 NUMBER(38), col5 NUMBER(38), col6 NUMBER(38), col7 NUMBER(38), PRIMARY KEY(col1));テーブル
test_tbl5の列col4とcol5を削除します。ALTER TABLE test_tbl5 DROP COLUMN col4, DROP COLUMN col5;テーブル
test_tbl5の構造を確認します。DESC test_tbl5;実行結果は次のとおりです:
+-------+--------------+------+------+---------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | +-------+--------------+------+------+---------+-------+ | COL1 | NUMBER(38) | NO | PRI | NULL | NULL | | COL2 | VARCHAR(50) | YES | NULL | NULL | NULL | | COL3 | NUMBER(38) | YES | NULL | NULL | NULL | | COL6 | NUMBER(38) | YES | NULL | NULL | NULL | | COL7 | NUMBER(38) | YES | NULL | NULL | NULL | +-------+--------------+------+------+---------+-------+ 3 rows in set
使われなくなった列のクリーンアップ
一部の列が削除された場合、それらの列が使用されなくなっても物理ストレージ容量を占有し続けます。これらの不要な列を削除して関連する容量を回収するには、使われなくなった列をクリーンアップする必要があります。
使われなくなった列をクリーンアップするSQL構文は次のとおりです:
ALTER TABLE table_name FORCE;
例:
ALTER TABLE test_tbl5 FORCE;
インデックスの変更
OceanBaseデータベースは、一意インデックス、通常インデックス、全文インデックスの追加をサポートしており、インデックスのプロパティの変更もサポートしています。
一意インデックスの追加
OceanBaseデータベースでは、テーブル作成後にそのテーブルに一意インデックスを追加できます。テーブル作成時に主キーが設定されている場合、OceanBaseデータベースはデフォルトで主キー列に一意インデックスを作成します。
テーブルに一意インデックスを追加する例:
テーブル
testを作成します。obclient> CREATE TABLE test (c1 int PRIMARY KEY, c2 VARCHAR(50));テーブルに一意インデックスを追加します。
obclient> ALTER TABLE test ADD UNIQUE INDEX index_name(c2);
通常インデックスの追加
OceanBaseデータベースでは、一度に複数のインデックスを追加できます。インデックスのキーワードとして
INDEXまたはKEYのいずれかを使用できます。テーブルに通常インデックスを追加する例:
テーブル
testを作成します。obclient> CREATE TABLE test (c1 int PRIMARY KEY, c2 VARCHAR(50));テーブルの
c1列とc2列にmyidxという名前のインデックスを同時に追加します。obclient> ALTER TABLE test ADD INDEX myidx(c1,c2);
全文インデックスの追加
OceanBaseデータベースでは、既存のテーブルに全文インデックスを追加できます。
例:
テーブル
testを作成します。CREATE TABLE test(col1 INT, col2 VARCHAR(20), col3 VARCHAR(50));テーブル
testに全文インデックスft_idx1_testを追加し、全文インデックスのトークナイザーをBENGと指定します。ALTER TABLE test ADD FULLTEXT INDEX ft_idx1_test(col2) WITH PARSER BENG;
インデックスの削除
OceanBaseデータベースではインデックスの削除をサポートしており、複数のインデックスを削除する場合はカンマで区切ります。インデックスのキーワードとして
INDEXまたはKEYのいずれかを使用できます。例:obclient> ALTER TABLE test DROP KEY index_name, DROP KEY index_name1;
テーブルの主キー、外部キー、およびCHECK制約の変更
OceanBaseデータベースでは、テーブルの主キー、外部キー、およびCHECK制約を変更できます。具体的な操作と詳細については、列の制約タイプの定義を参照してください。
テーブルのレプリカ数を変更する
テーブルのレプリカ数を 2 に設定します。例:
obclient> ALTER TABLE test SET REPLICA_NUM=2;
テーブルの名前変更
テーブル作成後、その名前を変更できます。OceanBaseデータベースはテーブルの名前変更をサポートしています。
例:
obclient> ALTER TABLE test RENAME TO t1;
また、以下のステートメントを使用することもできます:
obclient> RENAME TABLE test TO t1;
表の行ストアとカラムストアの変換
OceanBaseデータベースでは、デフォルトでテーブル作成時に行ストアテーブルが構築されます。WITH COLUMN GROUPオプションを設定することで、明示的にカラムストアまたは行ストア/カラムストアの冗長状態を指定できます。
テーブル作成後、ALTER TABLEステートメントを使用してテーブルの行ストアとカラムストアを変換できます。構文は以下のとおりです:
テーブルをカラムストアテーブルに変更する:
ALTER TABLE table_name ADD COLUMN GROUP([all columns,] each column) [DELAYED];テーブルのストレージ形式を削除する:
ALTER TABLE table_name DROP COLUMN GROUP([all columns,] each column);
パラメータの説明:
table_name:テーブル名を指定します。ADD COLUMN GROUP(all columns, each column):テーブルを行ストア/カラムストアの冗長形式に変更します。ADD COLUMN GROUP(each column):テーブルをカラムストア形式に変更します。DELAYED:オプションです。行ストアテーブルからカラムストアテーブルへのコマンド実行を遅延(非同期)させます。コマンド実行後、テーブル定義のストレージ形式は変更されますが、実際の行ストアからカラムストアへの操作はメジャーコンパクションタスクの実行時に行われます。この操作は現在のDMLをブロックせず、Online DDLです。DELAYEDを指定しない場合、デフォルトはOffline DDLとなり、行ストアテーブルからカラムストアテーブルへの操作は同期されます。注意
- 現在、行ストアテーブルをカラムストアテーブル(
each column)および行ストアテーブルを行ストア/カラムストアの冗長形式(all columns, each column)に変更する場合にのみ、DELAYEDを指定できます。 DELAYEDを使用して行ストアテーブルからカラムストアテーブルへの変換を遅延させた場合、ベースラインデータのメジャーコンパクションが完了するまで、データストレージ形式が実際に変換されていないため、クエリのパフォーマンスが期待通りにならない可能性があります。
- 現在、行ストアテーブルをカラムストアテーブル(
DROP COLUMN GROUP(all columns, each column):テーブルの行ストア/カラムストアの冗長形式を削除します。DROP COLUMN GROUP(all columns):テーブルの行ストア形式を削除します。DROP COLUMN GROUP(each column):テーブルのカラムストア形式を削除します。
行ストアテーブルからカラムストアテーブルへの変換
説明
WITH COLUMN GROUP(all columns) オプションを設定して作成した行ストアテーブルをカラムストアテーブルに変換する際、ADD COLUMN GROUP(each column) を設定した後、この列グループを削除するために DROP COLUMN GROUP(all columns) コマンドも実行する必要があります。
例:
デフォルトで行ストアテーブルを作成します。
行ストアテーブル
tbl1を作成します。CREATE TABLE tbl1(col1 INT, col2 VARCHAR(30), col3 DATE);行ストアテーブル
tbl1をカラムストアテーブルに変換します。オフラインDDLは以下のように変更します:
ALTER TABLE tbl1 ADD COLUMN GROUP(each column);オンラインDDL(非同期で行ストアテーブルをカラムストアテーブルに変換する)は以下のように変更します:
ALTER TABLE tbl1 ADD COLUMN GROUP(each column) DELAYED;
WITH COLUMN GROUP(all columns)オプションを設定して作成した行ストアテーブル。行ストアテーブル
tbl1を作成します。CREATE TABLE tbl1_ac(col1 INT, col2 VARCHAR(30), col3 DATE) WITH COLUMN GROUP(all columns);行ストアテーブル
tbl1をカラムストアテーブルに変換します。オフラインDDLは以下のように変更します:
ALTER TABLE tbl1_ac ADD COLUMN GROUP(each column);オンラインDDL(非同期で行ストアテーブルをカラムストアテーブルに変換する)は以下のように変更します:
ALTER TABLE tbl1_ac ADD COLUMN GROUP(each column) DELAYED;
DROP COLUMN GROUP(all columns)を設定して行ストア形式を削除します。ALTER TABLE tbl1_ac DROP COLUMN GROUP(all columns);
行ストアテーブルから行ストア・カラムストア冗長テーブルへの変換
例:
行ストアテーブル
tbl2を作成します。CREATE TABLE tbl2(col1 INT, col2 VARCHAR(30), col3 DATE);行ストアテーブル
tbl2を行ストア・カラムストア冗長テーブルに変換します。オフラインDDLは以下のように変更します:
ALTER TABLE tbl2 ADD COLUMN GROUP(all columns, each column);オンラインDDL(非同期で行ストアテーブルを行ストア・カラムストア冗長テーブルに変換する)は以下のように変更します:
ALTER TABLE tbl2 ADD COLUMN GROUP(all columns, each column) DELAYED;
行ストア・カラムストア冗長テーブルからカラムストアテーブルへの変換
例:
行ストア・カラムストア冗長テーブル
tbl3を作成します。CREATE TABLE tbl3(col1 INT, col2 VARCHAR(30), col3 DATE) WITH COLUMN GROUP(all columns, each column);行ストア・カラムストア冗長テーブル
tbl3をカラムストアテーブルに変換します。ALTER TABLE tbl3 DROP COLUMN GROUP(all columns);
行ストア/カラムストアの冗長テーブルを行ストアテーブルに変換する
例:
行ストア/カラムストアの冗長テーブル
tbl4を作成します。CREATE TABLE tbl4(col1 INT, col2 VARCHAR(30), col3 DATE) WITH COLUMN GROUP(all columns, each column);行ストア/カラムストアの冗長テーブル
tbl4を行ストアテーブルに変換します。ALTER TABLE tbl4 DROP COLUMN GROUP(each column);または
ALTER TABLE tbl4 DROP COLUMN GROUP(all columns, each column);
関連ドキュメント
ALTER TABLE ステートメントの詳細については、ALTER TABLEを参照してください。