OceanBaseデータベースのOracleモードにおける列の操作には、列の末尾への追加、列の削除、列名の変更、列型の変更、列のデフォルト値の管理、制約の管理、自動インクリメント列の値設定が含まれます。
末尾に列を追加する
末尾に列を追加する構文は次のとおりです:
ALTER TABLE table_name ADD column_name column_definition;
関連パラメータの説明は以下のとおりです:
table_name:列を追加する対象のテーブル名を指定します。column_name:追加する列名を指定します。column_definition:追加する列のデータ型と制約情報を指定します。
詳細については、ALTER TABLEを参照してください。
データベースにtbl1というテーブルが存在することを前提とします。tbl1のテーブル構造情報は以下のとおりです:
+-------+--------------+------+------+---------+-------+
| FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA |
+-------+--------------+------+------+---------+-------+
| C1 | NUMBER(10) | NO | PRI | NULL | NULL |
| C2 | VARCHAR2(50) | NO | NULL | NULL | NULL |
| C3 | NUMBER(3) | YES | NULL | NULL | NULL |
+-------+--------------+------+------+---------+-------+
ここでは、tbl1テーブルの末尾にC4列を追加する例を挙げて、テーブルに列を追加する方法を説明します。
obclient> ALTER TABLE tbl1 ADD C4 INT;
再度DESCRIBE tbl1;コマンドを実行してtbl1テーブルのテーブル構造を確認すると、出力は以下のとおりで、テーブルtbl1にC4列が新たに追加されています。
+-------+--------------+------+------+---------+-------+
| FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA |
+-------+--------------+------+------+---------+-------+
| C1 | NUMBER(10) | NO | PRI | NULL | NULL |
| C2 | VARCHAR2(50) | NO | NULL | NULL | NULL |
| C3 | NUMBER(3) | YES | NULL | NULL | NULL |
| C4 | NUMBER(38) | YES | NULL | NULL | NULL |
+-------+--------------+------+------+---------+-------+
列の削除
DROP COLUMN はオンラインDDL操作であり、削除をマークする方式で実装されているため、データの再編成はトリガーされません。つまり、削除された列が占有していたディスク容量は回収されず、削除された列はスキーマ内にそのまま残ります。対応する列を廃棄するには、マークを付けるだけです。廃棄された列およびスキーマ内のデータと情報を完全に削除するには、ALTER TABLE TABLE_NAME FORCE; コマンドを実行してください。
説明
OceanBase データベース V4.3.5 では、DROP COLUMN は V4.3.5 BP1 から導入されたオンラインDDL操作です。
列の削除に関する注意事項
列を削除する際には、以下の点に注意してください:
OceanBaseデータベースは、内部参照の整合性を保ち、潜在的な名前衝突を回避するため、廃棄された列を変更した後の列名を
SYS_C[COLUMN_ID]_TIME$に変更します。そのため、新規に追加する列名は、既に廃棄された列のシステム生成名と同じにすることはできません。つまり、SYS_C[COLUMN_ID]_TIME$形式の名前は使用しないようにし、名前の一意性を確保し、潜在的な競合を回避する必要があります。列名の確認方法の詳細については、ALL_TAB_COLSを参照してください。OceanBaseデータベースは、テーブル内に存在できる廃棄列の上限数を制限しています。廃棄列の数が128列を超えると、列の追加や削除操作を実行できなくなります。ユーザーは
ALTER TABLE TABLE_NAME FORCE;コマンドを実行してこれらの廃棄列をクリーンアップする必要があります。列の削除操作は他のDDL操作と組み合わせて実行する場合、Offline DDLとなり、データベースは物理的に削除を行い、列がテーブル構造およびストレージから完全に削除されることを保証します。
OceanBaseデータベースでは、単一データ行の最大長は1.5MBです。この長さの上限に達したテーブルで、テーブルの末尾にある一部の列が廃棄されたとしても、それらの列は物理ストレージ容量を占有し続けます。ユーザーがそのテーブルの末尾に新しい列を追加する予定がある場合は、まず
ALTER TABLE TABLE_NAME FORCE;コマンドを実行してこれらの廃棄列を削除し、関連する領域を回収してから、列の追加操作を実行する必要があります。以下のOffline DDL操作は、データの再編成をトリガーすると同時に、廃棄列およびそのスキーマ内のデータと情報を削除します。これは
ALTER TABLE TABLE_NAME FORCE;コマンドを実行した場合と同じ効果です:- 主キーの追加/削除・変更
- 混合列操作
- パーティションルールの変更
- 自動インクリメント列の追加
テーブルに廃棄列が存在する場合、パーティション交換操作、パーティションレベルの
INSERT OVERWRITE操作、およびパーティションレベルのフルダイレクトロード操作は実行できません。テーブルに廃棄列(削除フラグが付いた列)が存在する場合、
TRUNCATEテーブルは既に削除フラグが付いた列を削除しません。
Online DDLとOffline DDL操作の詳細については、Online DDLとOffline DDL操作を参照してください。
単一列の削除
列を削除する構文は次のとおりです:
ALTER TABLE table_name DROP COLUMN column_name;
ここで、table_name は削除対象の列が存在するテーブル名を指定し、column_name は削除対象の列名を指定します。
データベースに tbl1 テーブルが存在すると仮定します。tbl1 テーブルの構造情報は以下のとおりです:
+-------+--------------+------+------+---------+-------+
| FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA |
+-------+--------------+------+------+---------+-------+
| C1 | NUMBER(10) | NO | PRI | NULL | NULL |
| C2 | VARCHAR2(50) | NO | NULL | NULL | NULL |
| C3 | NUMBER(3) | YES | NULL | NULL | NULL |
+-------+--------------+------+------+---------+-------+
ここでは、tbl1 テーブルの C3 列を削除する例を挙げて、テーブルから列を削除する方法を説明します。
obclient> ALTER TABLE tbl1 DROP COLUMN C3;
再度 DESCRIBE tbl1; コマンドを実行して tbl1 テーブルの構造を確認すると、出力は以下のとおりで、テーブル tbl1 には C3 列が存在しません。
+-------+--------------+------+------+---------+-------+
| FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA |
+-------+--------------+------+------+---------+-------+
| C1 | NUMBER(10) | NO | PRI | NULL | NULL |
| C2 | VARCHAR2(50) | NO | NULL | NULL | NULL |
+-------+--------------+------+------+---------+-------+
複数列の削除
複数列を削除する構文は以下の2通りです:
方法1:
ALTER TABLE table_name DROP (column_name1, column_name2, ...);方法2:
ALTER TABLE table_name DROP COLUMN column_name1, DROP COLUMN column_name2, ...;
単一列を削除する場合と同様に、table_name は削除対象の列が存在するテーブル名を指定し、column_name は削除対象の列名を指定します。
データベースに tbl1 テーブルが存在することを前提とします。tbl1 テーブルの構造情報は以下のとおりです:
+-------+--------------+------+------+---------+-------+
| FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA |
+-------+--------------+------+------+---------+-------+
| C1 | NUMBER(30) | NO | PRI | NULL | NULL |
| C2 | VARCHAR2(50) | YES | NULL | NULL | NULL |
| C3 | NUMBER(30) | YES | NULL | NULL | NULL |
| C4 | NUMBER(30) | YES | NULL | NULL | NULL |
| C5 | NUMBER(30) | YES | NULL | NULL | NULL |
+-------+--------------+------+------+---------+-------+
ここでは、tbl1 テーブルの C4 列と C5 列を削除する例を用いて、ALTER TABLE table_name DROP (column_name1, column_name2, ...) を使用してテーブルから複数列を削除する方法を説明します。
obclient> ALTER TABLE tbl1 DROP COLUMN (C4, C5);
再度 DESCRIBE tbl1; コマンドを実行して tbl1 テーブルの構造を確認すると、出力は以下のとおりで、テーブル tbl1 には C4 列と C5 列が存在しません。
+-------+--------------+------+------+---------+-------+
| FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA |
+-------+--------------+------+------+---------+-------+
| C1 | NUMBER(30) | NO | PRI | NULL | NULL |
| C2 | VARCHAR2(50) | YES | NULL | NULL | NULL |
| C3 | NUMBER(30) | YES | NULL | NULL | NULL |
+-------+--------------+------+------+---------+-------+
次に、tbl1 テーブルの C2 列と C3 列を削除する例を用いて、ALTER TABLE table_nameE DROP COLUMN column_name1, DROP COLUMN column_name2, ... を使用してテーブルから複数列を削除する方法を説明します。
obclient> ALTER TABLE tbl1 DROP COLUMN C2, DROP COLUMN C3;
再度 DESCRIBE tbl1; コマンドを実行して tbl1 テーブルの構造を確認すると、出力は以下のとおりで、テーブル tbl1 には C2 列と C3 列が存在しません。
+-------+--------------+------+------+---------+-------+
| FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA |
+-------+--------------+------+------+---------+-------+
| C1 | NUMBER(30) | NO | PRI | NULL | NULL |
+-------+--------------+------+------+---------+-------+
廃棄列の削除
廃棄列を削除する構文は以下のとおりです:
ALTER TABLE TABLE_NAME FORCE;
説明
OceanBaseデータベースV4.3.5では、V4.3.5 BP1バージョンから廃棄列の削除がサポートされています。
ここでは、tbl1 テーブルの C2、C3、C4、C5 列を削除する例を用いて、テーブル内の廃棄列を削除する方法を説明します。
obclient> ALTER TABLE tbl1 FORCE;
列の名前変更
列の名前を変更する構文は次のとおりです:
ALTER TABLE table_name RENAME COLUMN old_col_name TO new_col_name;
関連パラメータの説明は以下のとおりです:
table_name:名前を変更する列が含まれるテーブルの名前を指定します。old_col_name:名前を変更する列の名前を指定します。new_col_name:名前を変更後の列の名前を指定します。
データベースにtbl1というテーブルが存在することを前提とします。tbl1のテーブル構造情報は以下のとおりです:
+-------+--------------+------+------+---------+-------+
| FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA |
+-------+--------------+------+------+---------+-------+
| C1 | NUMBER(10) | NO | PRI | NULL | NULL |
| C2 | VARCHAR2(50) | NO | NULL | NULL | NULL |
| C3 | NUMBER(3) | YES | NULL | NULL | NULL |
+-------+--------------+------+------+---------+-------+
ここでは、C3 列の名前を C4 に変更する例を用いて、テーブル内の列名を変更する方法を説明します。
obclient> ALTER TABLE tbl1 RENAME COLUMN C3 TO C4;
再度 DESCRIBE tbl1; コマンドを実行してtbl1テーブルのテーブル構造を確認すると、出力は以下のとおりで、テーブルtbl1の C3 列は C4 に名前が変更されています。
+-------+--------------+------+------+---------+-------+
| FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA |
+-------+--------------+------+------+---------+-------+
| C1 | NUMBER(10) | NO | PRI | NULL | NULL |
| C2 | VARCHAR2(50) | NO | NULL | NULL | NULL |
| C4 | NUMBER(3) | YES | NULL | NULL | NULL |
+-------+--------------+------+------+---------+-------+
列型の変更
OceanBaseデータベースでサポートされている列型の変換は以下のとおりです:
文字列型の列のデータ型変換。
CHARとVARCHAR2を含みます。数値データ型の精度変更をサポートします。
NUMBERは対象外です(精度を下げることはできません)。文字データ型の精度変更をサポートします。
CHAR(精度を下げることはできません)、VARCHAR2、NVARCHAR2、NCHARを含みます。
OceanBaseデータベースのOracleモードにおける列型変更ルールについては、列型変更ルールを参照してください。
列型を変更する構文は以下のとおりです:
ALTER TABLE table_name MODIFY column_name data_type;
関連パラメータの説明は以下のとおりです:
table_name:変更対象の列が存在するテーブル名を指定します。column_name:変更対象の列名を指定します。data_type:変更後のデータ型を指定します。
列型を変更する例
文字データ型間の変換例
以下のように、test01 テーブルを作成します:
obclient> CREATE TABLE test01 (C1 INT PRIMARY KEY, C2 CHAR(10), C3 VARCHAR2(32));
test01 テーブルを例に、以下の例を組み合わせて、文字データ型列のデータ型と長さの変更方法を説明します。
test01 テーブルの
C2列の長さを20文字に変更するobclient> ALTER TABLE test01 MODIFY C2 CHAR(20);test01 テーブルの
C2列のデータ型をVARCHARに変更し、長さを最大20文字に指定するobclient> ALTER TABLE test01 MODIFY C2 VARCHAR(20);test01 テーブルの
C3列の長さを最大64文字に変更するobclient> ALTER TABLE test01 MODIFY C3 VARCHAR(64);test01 テーブルの
C3列の長さを最大16文字に変更するobclient> ALTER TABLE test01 MODIFY C3 VARCHAR(16);test01 テーブルの
C3列のデータ型をCHARに変更し、長さを256文字に指定するobclient> ALTER TABLE test01 MODIFY C3 CHAR(256);
数値データ型の精度を変更する例
以下のように、test02 テーブルを作成します:
obclient> CREATE TABLE test02(C1 NUMBER(10,2));
test02 テーブルを例に、精度を持つ数値データ型列の精度を変更する方法を説明します。
obclient> ALTER TABLE test02 MODIFY C1 NUMBER(11,3);
列のデフォルト値を管理する
設定されていない場合、列のデフォルト値は NULL です。列のデフォルト値を管理する構文は以下のとおりです:
ALTER TABLE table_name MODIFY column_name data_type DEFAULT const_value;
関連パラメータの説明は以下のとおりです:
table_name:デフォルト値を変更する列が含まれるテーブル名を指定します。column_name:デフォルト値を変更する列名を指定します。data_type:変更対象の列のデータ型を指定します。現在のデータ型を指定することも、その列を他のデータ型に変更することもできます。サポートされているデータ型については、前述の 列の型の変更 を参照してください。const_value:変更後の列のデフォルト値を指定します。
データベースに tbl1 テーブルが存在すると仮定します。tbl1 テーブルの構造情報は以下のとおりです:
+-------+--------------+------+------+---------+-------+
| FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA |
+-------+--------------+------+------+---------+-------+
| C1 | NUMBER(10) | NO | PRI | NULL | NULL |
| C2 | VARCHAR2(50) | NO | NULL | NULL | NULL |
| C3 | NUMBER(3) | YES | NULL | 333 | NULL |
+-------+--------------+------+------+---------+-------+
以下のコマンドを実行して列のデフォルト値を設定できます。この例では、
C1列のデフォルト値を 111 に変更します。obclient> ALTER TABLE tbl1 MODIFY C1 NUMBER(10) DEFAULT 111;以下のコマンドを実行して列のデフォルト値を削除できます。この例では、
C3列のデフォルト値を削除します。obclient> ALTER TABLE tbl1 MODIFY C3 NUMBER(3) DEFAULT NULL;
再度 DESCRIBE tbl1; コマンドを実行して tbl1 テーブルの構造を確認すると、出力は以下のとおりです。tbl1 テーブルの C1 列のデフォルト値は 111、C3 列のデフォルト値は NULL です。
+-------+--------------+------+------+---------+-------+
| FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA |
+-------+--------------+------+------+---------+-------+
| C1 | NUMBER(10) | NO | PRI | 111 | NULL |
| C2 | VARCHAR2(50) | NO | NULL | NULL | NULL |
| C3 | NUMBER(3) | YES | NULL | NULL | NULL |
+-------+--------------+------+------+---------+-------+
制約の管理
OceanBaseデータベースのOracleモードでは、テーブルに列制約を追加できます。例えば、既存の列を自動インクリメント列に変更したり、列がNULLを許容するかどうかを設定したり、列の一意性を指定したりすることができます。このセクションでは、それぞれの操作方法について説明します。
制約を管理する構文は以下のとおりです:
ALTER TABLE table_name
MODIFY column_name data_type
[NULL | NOT NULL]
[PRIMARY KEY]
[UNIQUE];
関連パラメータの説明は以下のとおりです:
table_name:制約を追加する列が存在するテーブルの名前を指定します。column_name:制約を追加する列の名前を指定します。data_type:変更対象の列のデータ型を指定します。現在のデータ型を指定することも、その列を他のデータ型に変更することもできます。サポートされているデータ型については、前述の列の型の変更を参照してください。NULL | NOT NULL:選択した列がNULLを許容するかどうか(NULL)、またはNULLを許容しないかどうか(NOT NULL)を指定します。PRIMARY KEY:選択した列を主キーに設定します。UNIQUE:選択した列の一意性を指定します。
データベースにtbl1というテーブルが存在すると仮定します。tbl1のテーブル構造情報は以下のとおりです:
+-------+--------------+------+-----+---------+-------+
| FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA |
+-------+--------------+------+-----+---------+-------+
| C1 | NUMBER(10) | YES | NULL | NULL | NULL |
| C2 | VARCHAR2(50) | YES | NULL | NULL | NULL |
| C3 | NUMBER(3) | YES | NULL | NULL | NULL |
+-------+--------------+------+-----+---------+-------+
C1列を主キーに設定しますobclient> ALTER TABLE tbl1 MODIFY C1 NUMBER(10) PRIMARY KEY;C2列をNULLを許容しない列に設定しますobclient> ALTER TABLE tbl1 MODIFY C2 VARCHAR(50) NOT NULL;C3列を一意の列に設定しますobclient> ALTER TABLE tbl1 MODIFY C3 NUMBER(3) UNIQUE;再度
DESCRIBE tbl1;コマンドを実行して、tbl1 テーブルのテーブル構造を確認します+-------+--------------+------+-----+---------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | +-------+--------------+------+-----+---------+-------+ | C1 | NUMBER(10) | NO | PRI | NULL | NULL | | C2 | VARCHAR2(50) | NO | NULL | NULL | NULL | | C3 | NUMBER(3) | YES | UNI | NULL | NULL | +-------+--------------+------+-----+---------+-------+
自動インクリメント列の値を設定する
自動インクリメント列の値を設定するには、まず CREATE SEQUENCE を使用して自動インクリメントフィールドを作成し、次に nextval 関数を使用してシーケンスから次の値を取得します。
自動インクリメント列の値を管理する例は以下のとおりです:
自動インクリメントシーケンス
seq1を作成し、開始値を1、増分を1、キャッシュサイズを10に設定します。obclient> CREATE SEQUENCE seq1 MINVALUE 1 START WITH 1 INCREMENT BY 1 CACHE 10;tbl1 テーブルにデータを挿入します。
obclient> INSERT INTO tbl1(C1, C2, C3) VALUES (seq1.nextval, 'zhangsan', 20), (seq1.nextval, 'lisi', 21), (seq1.nextval, 'wangwu', 22);以下のコマンドを実行して、tbl1 テーブルのデータを確認します。
obclient> SELECT * FROM tbl1;出力は以下のとおりで、
C1列の値は1からインクリメントされます。+------+----------+------+ | C1 | C2 | C3 | +------+----------+------+ | 1 | zhangsan | 20 | | 2 | lisi | 21 | | 3 | wangwu | 22 | +------+----------+------+手動で
seq1シーケンスをトリガーして、自動インクリメント列の値を変更します。obclient> SELECT seq1.nextval FROM sys.dual;出力は以下のとおりです:
+---------+ | NEXTVAL | +---------+ | 4 | +---------+再度、tbl1 テーブルにデータを挿入します。
obclient> INSERT INTO tbl1(C1, C2, C3) VALUES (seq1.nextval, 'oceanbase', 12);再度、以下のコマンドを実行して、tbl1 テーブルのデータを確認します。
obclient> SELECT * FROM tbl1;出力は以下のとおりで、
C1列の値に4の行はなく、直接5の値が挿入されます。+------+-----------+------+ | C1 | C2 | C3 | +------+-----------+------+ | 1 | zhangsan | 20 | | 2 | lisi | 21 | | 3 | wangwu | 22 | | 5 | oceanbase | 12 | +------+-----------+------+