OceanBaseデータベースのOracleモードで列型を変更する際には、まずテーブルレベルの列型変更ルール、特に一部のデータ型の禁止シナリオを考慮する必要があります。次に、列型変更におけるソースデータ型とターゲットデータ型の変更ルールを考慮します。
テーブル単位の列型変更ルール
禁止ルール
外部キー制約
Online DDLとOffline DDLでは、
VARCHAR、VARCHAR2、NVARCHAR2データ型の精度の拡大または縮小のみをサポートします。Trigger制約
Offline DDLに限定されますが、列に
DISABLE以外のTrigger制約がある場合、列型の変更は禁止されます。すべてのTriggerがDISABLEであれば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
次の表は、間隔データ型間の変換を示しています。
データ型 |
To 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 | サポート | サポート |