テーブル作成後、ALTER TABLE ステートメントを使用してテーブルを変更できます。
テーブルの照合順序と文字セットを変更する
テーブル作成時に、テーブルの照合順序と文字セットが明確に定義されていない場合、デフォルトでデータベースの文字セットと照合順序が使用されます。データベースの照合順序と文字セットの詳細については、データベースレベルの文字セットと照合順序を参照してください。
テーブル作成後、テーブルの照合順序と文字セット設定を変更できます。ステートメントは以下のとおりです:
ALTER TABLE table_name [[DEFAULT] CHARACTER SET [=] charset_name] [COLLATE [=] collation_name];
OceanBaseデータベースにおけるテーブルの照合順序と文字セットの詳細については、テーブルレベルの文字セットと照合順序を参照してください。
注意
テーブルの照合順序と文字セット設定を変更しても、既存の文字型列のデータ保存方法には影響しません。
例:
テーブル
tbl1を作成します。obclient> CREATE TABLE tbl1 (c1 int, c2 varchar(32), c3 varchar(32), PRIMARY KEY(c1), UNIQUE KEY uk1(c2));テーブルの照合順序と文字セットを変更します。
obclient> ALTER TABLE tbl1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin;テーブルに既存のデータがある場合、テーブル内の既存データの照合順序と文字セットを変更し、テーブルの照合順序と文字セットも対応する設定に変更できます。例:
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と文字セット設定を変更できます。
テーブル 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;
説明
OceanBaseデータベースV4.3.5では、V4.3.5 BP2バージョンから廃棄された列のクリーンアップがサポートされています。
例:
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を参照してください。