テーブル作成後、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;
説明
OceanBaseデータベースV4.3.5では、V4.3.5 BP1バージョンから置き去り列のクリーンアップがサポートされています。
例:
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を参照してください。