OceanBaseデータベースのOracleモードで列型を変更する際には、まずテーブルレベルの列型変更ルール、特に一部のデータ型の使用禁止シナリオを考慮する必要があります。次に、列型変更におけるソースデータ型とターゲットデータ型の変更ルールを検討します。
テーブル単位の列型変更ルール
禁止ルール
外部キー制約
Online DDLおよびOffline DDLにおいて、
VARCHAR、VARCHAR2、NVARCHAR2データ型の精度を大きくするか小さくするかの変更のみがサポートされます。Trigger制約
Offline DDLに限り、列に
DISABLE以外のTrigger制約がある場合、列型の変更は禁止されます。すべてDISABLEのTriggerであればDDLに影響はなく、新しいテーブルにはそのDISABLETriggerを含める必要があります。パーティションキー
Online DDLおよびOffline DDLにおいて、列がパーティションキーの一部として使用されている場合、型や長さの変更機能は禁止されます。
Online DDLおよびOffline DDLにおいて、変更対象の列が生成列によって参照されている場合、列型の変更機能は禁止されます。
変更ルール
同じデータ型の長さが長くなる場合、例えばある列のデータ型を
CHARからCHAR(11)に変更する場合、OceanBaseデータベースではCHARのストレージ方式がOnline操作であり、データの書き換えも不要であるため、その列にインデックステーブルのみが存在する場合は、Online方式でインデックス列の長さを変更できます。ただし、その列が主キーまたはパーティションキーとして使用されている場合は、Offline操作を実行する必要があります。また、CHECK制約に依存する場合、ユーザーが予想するデータの長さの変化によりCHECK制約を満たせない可能性があるため、この場合もOffline操作を実行する必要があります。つまり、「同じ型で長さが変わる場合、CHECK制約、主キー、パーティションキーはOfflineである」ということです。VARCHAR型の長さが長くなる場合、例えばLENGTH(c1)のような操作は変更されないため、Online方式で変更できますが、同時にインデックステーブルなどの関連依存オブジェクトのSchemaも修正する必要があります。注意すべき点として、この場合、主キーまたはパーティションキーを変更しても、Online方式で可能であるということです。つまり、「ユーザーがデータの変更を予想しない場合でも、依存オブジェクト内のSchemaも変更する必要がある」ということです。OceanBaseデータベースでは、同じ大規模データ型(数値データ型、文字データ型、日付データ型、
ROWIDデータ型)の変更が可能です。そのデータ型がインデックステーブル、外部キー、CHECK制約、主キーなどによって参照されていない場合は、Online方式で変更できます。しかし、これらの依存オブジェクトによって参照されている場合は、Offline方式で変更する必要があります。つまり、「大規模型の変更に依存オブジェクトがある場合はOfflineである」ということです。数値データ型において、
SIGNEDとUNSIGNEDの変更が生じる場合、型の変更が許可されている場合でも、Offline操作を実行する必要があります。
列単位の変更ルール
OceanBaseデータベースでは、すべての列データ型は5つの主要なカテゴリーに分類されます。それぞれ数値データ型、文字データ型、日付時刻データ型、区切りデータ型、およびROWID型です。
現在のOceanBaseデータベースのバージョンでは、ROWID型とUROWID型は内部実装上、どちらもUROWID型として実現されています。そのため、ROWID型とUROWID型の変換ルールは、UROWID型同士の変換ルールと同一です。
OceanBaseデータベースのOracleモードでは、大規模データ型間での相互変換は許可されていません。したがって、ここでは大規模データ型内部での変換のみを対象とします。
数値データ型間の変換
数値データ型は以下のように分類されます:
NUMBERFLOAT注意
FLOAT(p)は浮動小数点数ではなく、NUMBERデータ型のサブタイプであり、そのバイナリ精度範囲は [1,126] です。BINARY_FLOATBINARY_DOUBLE
以下の表は、数値データ型間の変換状況を示しています。
| データ型 | NUMBER | FLOAT | BINARY_FLOAT | BINARY_DOUBLE |
|---|---|---|---|---|
NUMBER |
サポート | サポート | 変換禁止 | 変換禁止 |
FLOAT |
サポート | サポート | 変換禁止 | 変換禁止 |
BINARY_FLOAT |
変換禁止 | 変換禁止 | サポート | 変換禁止 |
BINARY_DOUBLE |
変換禁止 | 変換禁止 | 変換禁止 | サポート |
文字データ型間の変換
文字データ型は以下のように分類されます:
CHARVARCHAR、VARCHAR2:VARCHARとVARCHAR2は同一の型です。NCHAR、NVARCHAR2:すべての文字を2バイトで表現します。BLOB:文字セットはBINARYです。CLOB:文字セットはUTF8MB4です。RAW:どのような文字セットであっても、バイナリ形式で保存されます。
以下の表は、文字データ型間の変換状況を示しています。
| データ型 | To CHAR | To VARCHAR、VARCHAR2 | To NCHAR | To NVARCHAR2 | To BLOB | To CLOB | To RAW |
|---|---|---|---|---|---|---|---|
CHAR |
サポート | サポート | サポート | 変換禁止 | 変換禁止 | 変換禁止 | 変換禁止 |
VARCHAR、VARCHAR2 |
サポート | サポート | サポート | 変換禁止 | 変換禁止 | 変換禁止 | 変換禁止 |
NCHAR |
変換を禁止します | 変換を禁止します | サポート | サポート | 変換を禁止 | 変換を禁止 | 変換を禁止します。 |
NVARCHAR2 |
変換禁止 | 変換禁止 | サポート | サポート | 変換禁止。 | 変換禁止 | 変換禁止。 |
BLOB |
変換禁止 | 変換禁止 | 変換禁止 | 変換禁止 | サポート | 変換禁止 | 変換禁止 |
CLOB |
変換禁止 | 変換禁止 | 変換禁止 | 変換禁止 | 変換禁止 | サポート | 変換禁止 |
RAW |
変換禁止 | 変換禁止 | 変換禁止 | 変換禁止 | 変換禁止 | 変換禁止 | サポート |
日付時刻データ型の大分類における変換
日付時刻データ型は以下のように分類されます:
DATETIMESTAMPTIMESTAMP WITH TIME ZONETIMESTAMP WITH LOCAL TIME ZONE
以下の表は、日付時刻データ型の大分類における変換状況を示しています。
| データ型 | To DATE | To TIMESTAMP | To TIMESTAMP WITH TIME ZONE | To TIMESTAMP WITH LOCAL TIME ZONE |
|---|---|---|---|---|
DATE |
サポート | サポート | サポート | サポート |
TIMESTAMP |
サポート | サポート | 変換禁止 | 変換禁止 |
TIMESTAMP WITH TIME ZONE |
変換禁止 | 変換禁止 | サポート | 変換禁止 |
TIMESTAMP WITH LOCAL TIME ZONE |
サポート | 変換禁止 | 変換禁止 | サポート |
間隔データ型間の変換
間隔データ型は以下のように分類されます:
INTERVAL YEAR TO MONTHINTERVAL DAY TO SECOND
以下の表は、間隔データ型間の変換状況を示しています。
| データ型 | INTERVAL YEAR TO MONTH | To INTERVAL DAY TO SECOND |
|---|---|---|
| INTERVAL YEAR TO MONTH | サポート | 変換禁止 |
| INTERVAL DAY TO SECOND | 変換禁止 | サポート |
ROWIDデータ型間の変換
ROWID データ型は以下のように分類されます:
ROWIDUROWID
以下の表は、ROWID データ型間の変換状況を示しています。
| データ型 | To ROWID | To UROWID |
|---|---|---|
| ROWID | サポート | サポート |
| UROWID | サポート | サポート |