テーブル作成後は、ALTER TABLE ステートメントを使用してテーブルを変更できます。
注意点
テーブルの主キーまたは列型を変更する操作を実行している間は、他のDDL操作を実行することは禁止されています。同様に、他のDDL操作を実行している間は、テーブルの主キーまたは列型を変更する操作を実行することは禁止されています。
列の追加、変更、削除、および廃棄列のクリア
OceanBaseデータベースは、列の追加、列とその属性の変更、列の削除、廃棄列のクリアなどをサポートしています。
列の追加
OceanBaseデータベースではテーブルに列を追加できますが、主キー列を直接追加することはサポートされていません。主キー列を追加する必要がある場合は、まず列を追加してから、その列に主キーを設定することを推奨します。主キーの追加に関する操作については、列の制約タイプの定義を参照してください。
列を追加するSQL構文は以下のとおりです:
ALTER TABLE table_name ADD column_definition;
例:
テストテーブル
test_tbl1を作成します。CREATE TABLE test_tbl1 ( col1 NUMBER(38), col2 VARCHAR2(50), PRIMARY KEY(col1));テーブル
test_tbl1に列col3を追加します。ALTER TABLE test_tbl1 ADD col3 NUMBER(38);テーブル
test_tbl1の構造を確認します。DESCRIBE test_tbl1;実行結果は次のとおりです:
+-------+--------------+------+------+---------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | +-------+--------------+------+------+---------+-------+ | COL1 | NUMBER(38) | NO | PRI | NULL | NULL | | COL2 | VARCHAR2(50) | YES | NULL | NULL | NULL | | COL3 | NUMBER(38) | YES | NULL | NULL | NULL | +-------+--------------+------+------+---------+-------+ 3 rows in set
列の変更
列属性の変更
OceanBaseデータベースは、さまざまな列型間の変換、デフォルト値、およびNOT NULL制約などをサポートしています。OceanBaseデータベースにおける列型の変換ルールおよび詳細情報については、列型変更ルールを参照してください。
列型を変更するSQL構文は以下のとおりです:
ALTER TABLE table_name MODIFY [COLUMN] column_definition;
例:
テストテーブル
test_tbl2を作成します。CREATE TABLE test_tbl2 ( col1 NUMBER(38), col2 VARCHAR2(20));テーブル
test_tbl2の構造を確認します。DESCRIBE test_tbl2;実行結果は次のとおりです:
+-------+--------------+------+------+---------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | +-------+--------------+------+------+---------+-------+ | COL1 | NUMBER(38) | YES | NULL | NULL | NULL | | COL2 | VARCHAR2(20) | YES | NULL | NULL | NULL | +-------+--------------+------+------+---------+-------+ 2 rows in setテーブル
test_tbl2の列col2の型をCHAR(50)に変更します。ALTER TABLE test_tbl2 MODIFY col2 CHAR(50);テーブル
test_tbl2の列col1のデフォルト値を0に変更します。ALTER TABLE test_tbl2 MODIFY col1 DEFAULT 0;テーブル
test_tbl2の列col2の値をNOT NULLに変更します。ALTER TABLE test_tbl2 MODIFY col2 NOT NULL;テーブル
test_tbl2の構造を確認します。DESCRIBE test_tbl2;実行結果は次のとおりです:
+-------+------------+------+------+---------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | +-------+------------+------+------+---------+-------+ | COL1 | NUMBER(38) | YES | NULL | 0 | NULL | | COL2 | CHAR(50) | NO | NULL | NULL | NULL | +-------+------------+------+------+---------+-------+ 2 rows in set
列名の変更
列名を変更するSQL構文は次のとおりです:
ALTER TABLE table_name RENAME COLUMN old_col_name TO new_col_name;
例:
テストテーブル
test_tbl3を作成します。CREATE TABLE test_tbl3 ( col1 NUMBER(38), col2 VARCHAR2(20), PRIMARY KEY(col1));テーブル
test_tbl3の列col1の名前をcol1_newに変更します。ALTER TABLE test_tbl3 RENAME COLUMN col1 TO col1_new;テーブル
test_tbl3の構造を確認します。DESCRIBE test_tbl3;実行結果は次のとおりです:
+----------+--------------+------+------+---------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | +----------+--------------+------+------+---------+-------+ | COL1_NEW | NUMBER(38) | NO | PRI | NULL | NULL | | COL2 | VARCHAR2(20) | YES | NULL | NULL | NULL | +----------+--------------+------+------+---------+-------+ 2 rows in set
列の削除
列を削除することができます。テーブル内の列は削除できますが、主キー列の削除は許可されません。
単一列の削除
単一列を削除するSQL構文は次のとおりです:
ALTER TABLE table_name DROP COLUMN column_name;
例:
テストテーブル
test_tbl4を作成します。CREATE TABLE test_tbl4 ( col1 NUMBER(38), col2 VARCHAR2(50), PRIMARY KEY(col1));テーブル
test_tbl4の列col2を削除します。ALTER TABLE test_tbl4 DROP COLUMN col2;テーブル
test_tbl4の構造を確認します。DESCRIBE test_tbl4;実行結果は次のとおりです:
+-------+------------+------+------+---------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | +-------+------------+------+------+---------+-------+ | COL1 | NUMBER(38) | NO | PRI | NULL | NULL | +-------+------------+------+------+---------+-------+ 1 row in set
複数列の削除
複数列を削除するSQL構文は次のとおりです:
ALTER TABLE table_name DROP (column_name1, column_name1, ...);
または
ALTER TABLE table_name DROP COLUMN column_name1, DROP COLUMN column_name2, ...;
例:
テストテーブル
test_tbl5を作成します。CREATE TABLE test_tbl5 ( col1 NUMBER(38), col2 VARCHAR2(50), col3 NUMBER(38), col4 NUMBER(38), col5 NUMBER(38), col6 NUMBER(38), col7 NUMBER(38), PRIMARY KEY(col1));テーブル
test_tbl5の列col6とcol7を削除します。ALTER TABLE test_tbl5 DROP (col6, col7);テーブル
test_tbl5の列col4とcol5を削除します。ALTER TABLE test_tbl5 DROP COLUMN col4, DROP COLUMN col5;テーブル
test_tbl5の構造を確認します。DESCRIBE test_tbl5;実行結果は次のとおりです:
+-------+--------------+------+------+---------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | +-------+--------------+------+------+---------+-------+ | COL1 | NUMBER(38) | NO | PRI | NULL | NULL | | COL2 | VARCHAR2(50) | YES | NULL | NULL | NULL | | COL3 | NUMBER(38) | YES | NULL | NULL | NULL | +-------+--------------+------+------+---------+-------+ 3 rows in set
廃棄列のクリーンアップ
一部の列が削除された場合、それらの列が使用されなくなっても物理ストレージ容量を占有し続けます。これらの廃棄列を削除して関連する領域を回収するには、廃棄列をクリーンアップする必要があります。
廃棄列をクリーンアップするSQL構文は次のとおりです:
ALTER TABLE table_name FORCE;
例:
ALTER TABLE test_tbl5 FORCE;
一意性制約の追加
OceanBaseデータベースは、既存のテーブルに一意性制約を追加することをサポートしています。
一意性制約を追加するSQL構文は以下のとおりです:
ALTER TABLE table_name ADD [CONSTRAINT [constraint_name]] UNIQUE (column_name [, column_name ]...);
例:
テストテーブル
test_tbl6を作成します。CREATE TABLE test_tbl6 ( col1 NUMBER(38), col2 VARCHAR2(50), PRIMARY KEY(col1));テーブル
test_tbl6の列col2に一意性制約を追加します。ALTER TABLE test_tbl6 ADD UNIQUE(col2);テーブル
test_tbl6の構造を確認します。DESCRIBE test_tbl6;実行結果は次のとおりです:
+-------+--------------+------+------+---------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | +-------+--------------+------+------+---------+-------+ | COL1 | NUMBER(38) | NO | PRI | NULL | NULL | | COL2 | VARCHAR2(50) | YES | UNI | NULL | NULL | +-------+--------------+------+------+---------+-------+ 2 rows in set
テーブルの名前変更
テーブル作成後、テーブル名を変更できます。
テーブル名を変更するSQL構文は以下のとおりです:
ALTER TABLE old_table_name RENAME TO new_table_name;
または
RENAME old_table_name TO new_table_name;
例:
ALTER TABLE test RENAME TO t1;
または
RENAME test TO t1;
テーブルの主キーと外部キーを変更する
テーブル作成後、OceanBaseデータベースではテーブルの主キーと外部キーの追加および削除がサポートされています。テーブルの主キーと外部キーを変更する具体的な操作および説明については、列の制約タイプの定義を参照してください。
列のSkip Indexプロパティの変更
OceanBaseデータベースでは、ALTER TABLEステートメントを使用してSkip Indexプロパティの追加、変更、削除をサポートしています。
Skip Indexの詳細については、列のSkip Indexプロパティを参照してください。
例:
以下のSQLステートメントを使用して、テーブル
test_skidxを作成します。CREATE TABLE test_skidx( col1 NUMBER SKIP_INDEX(MIN_MAX, SUM), col2 FLOAT SKIP_INDEX(MIN_MAX), col3 VARCHAR2(1024) SKIP_INDEX(MIN_MAX), col4 CHAR(10) );テーブル
test_skidxの列col2のSkip IndexプロパティをSUMSkip Indexタイプに変更します。ALTER TABLE test_skidx MODIFY col2 FLOAT SKIP_INDEX(SUM);テーブル作成後に列のSkip Indexプロパティを追加します。テーブル
test_skidxの列col4にMIN_MAXSkip Indexタイプを追加します。ALTER TABLE test_skidx MODIFY col4 CHAR(10) SKIP_INDEX(MIN_MAX);テーブル作成後に列のSkip Indexプロパティを削除します。テーブル
test_skidxの列col1のSkip Indexプロパティを削除します。ALTER TABLE test_skidx MODIFY col1 NUMBER SKIP_INDEX();
表の行ストアとカラムストアの変換
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 NUMBER, col2 VARCHAR2(30));行ストアテーブル
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 NUMBER, col2 VARCHAR2(30)) 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 NUMBER, col2 VARCHAR2(30));行ストアテーブル
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 NUMBER, col2 VARCHAR2(30)) WITH COLUMN GROUP(all columns, each column);行ストア・カラムストア冗長テーブル
tbl3をカラムストアテーブルに変換します。ALTER TABLE tbl3 DROP COLUMN GROUP(all columns);
行ストア/カラムストアの冗長テーブルを行ストアテーブルに変換する
例:
行ストア/カラムストアの冗長テーブル
tbl4を作成します。CREATE TABLE tbl4(col1 NUMBER, col2 VARCHAR2(30)) 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を参照してください。