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はOnline DDL操作であり、削除をマークする方式で実装されており、データ再編成をトリガーしません。つまり、削除された列が占有していたディスク容量は回収されず、また、削除された列はスキーマ内に依然として存在します。ただし、対応する列はマークによって廃棄されるだけです。廃棄された列およびスキーマ内のデータや情報を完全に削除するには、ALTER TABLE TABLE_NAME FORCE;コマンドを実行してください。
説明
OceanBaseデータベースV4.3.5バージョンでは、DROP COLUMNはOnline DDL操作であり、V4.3.5 BP1バージョンから導入されました。
列の削除に関する注意事項
列を削除する際には、以下の点にご注意ください:
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_name E 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 | +------+-----------+------+