OceanBaseデータベースのMySQLモードで列型を変更する際には、まずテーブルレベルの列型変更ルール、特に一部のデータ型の禁止シナリオを考慮する必要があります。次に、列型変更におけるソースデータ型とターゲットデータ型の変更ルールを検討します。
テーブル単位の列型変更ルール
禁止ルール
外部キー制約
Online DDLとOffline DDLにおいて、以下の特別な場合を除き(注意:関連する型の変更は表示精度のみを変更し、格納構造は変更しない)、外部キー列の型変更はサポートされません。
列のデータ型が
FLOAT(m,n)の場合、精度の変更はサポートされますが、SIGNEDとUNSIGNEDの相互変換はサポートされません。列のデータ型が
DOUBLE(m,n)の場合、精度の変更はサポートされますが、SIGNEDとUNSIGNEDの相互変換はサポートされません。列のデータ型が
VARCHAR(m)の場合、精度の引き上げはサポートされますが、精度の引き下げやCHAR型への変更はサポートされません。
CHECK制約Online DDLとOffline DDLにおいて、整数型(
INTEGER)の列を除き、CHECK制約を持つ列の型変更はサポートされません。Trigger制約
Offline DDLにのみ該当します。列に
DISABLE以外のTrigger制約がある場合、列型の変更は禁止されます。すべてのTriggerがDISABLEである場合、DDL操作には影響せず、新しいテーブルにもこのDISABLEのTriggerを含める必要があります。
変更ルール
同一データ型で長さが長くなる場合、例えばある列のデータ型を
VARCHAR(8)からVARCHAR(11)に変更する操作は、Online DDLとして実行でき、データの再書き込みは不要です。- Online DDLにより列の長さを変更する際、その列にインデックステーブルが存在する場合(例えば
VARCHAR型の長さが長くなる場合)、Online DDLによる変更時には、インデックステーブルなどの依存オブジェクトのスキーマも変更する必要があります。つまり、「ユーザーが想定するデータの変更はないが、依存オブジェクト内のスキーマも変更する必要がある」ということです。 INTEGERおよびDecimalInt型の列について、それらがインデックス列または主キー列である場合、列型の拡張操作はOnline DDLによって実行できます。
- Online DDLにより列の長さを変更する際、その列にインデックステーブルが存在する場合(例えば
OceanBaseデータベースでは、
LOB型の拡張について、Online DDL操作は以下のケースをサポートします:- 通常列の変更。
- 生成列(Store/Virtual)としての変更
- 生成列に依存する(Store/Virtual)変更
NOT NULLおよびCHECK制約の追加。- 既存の
NOT NULL制約の変更。
数値データ型において、
SIGNEDとUNSIGNEDの変換が発生した場合、型変更が許可される場合でも、Offline操作を実行する必要があります。文字データ型において、文字セットや照合順序(Collation)の変更が発生した場合、列型変更が許可される場合でも、Offline操作を実行する必要があります。ある列が生成列によって参照されている場合、列型の変更操作は許可されます。
列レベルの変換ルール
OceanBaseデータベースでは、すべての列データ型は数値データ型、文字データ型、時系列データ型の3つの大きなカテゴリに分類されます。これら3つのカテゴリ間での変換ルールは類似しており、各カテゴリ内での変更ルールも類似していますが、いくつかの特殊なケースもあります。
以下の各表は、それぞれの大きなカテゴリ内およびカテゴリ間の変換状況を列挙したものです。
数値データ型間の変換
数値データ型は以下のように分類されます:
整数型:
TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT浮動小数点数型:
FLOAT、DOUBLE固定小数点数型:
NUMBERバイナリ型:
BIT
次の表は、数値データ型間の変換ルールを示したものです。
データ型 |
To TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT |
To FLOAT、DOUBLE |
To NUMBER |
To BIT |
|---|---|---|---|---|
| 整数型 | サポート | サポート | サポート | サポート |
| 浮動小数点数 | サポート | サポート | サポート | サポート |
| 固定小数点数 | サポート | サポート | サポート | サポート |
| バイナリ | サポート | サポート | サポート | サポート |
文字データ型間の変換
文字データ型は以下のように分類されます:
CHAR、VARCHARBINARY、VARBINARYTEXT大型データ型:TINYTEXT、MEDIUMTEXT、TEXT、LONGTEXTBLOB大型データ型:TINYBLOB、MEDIUMBLOB、BLOB、LONGBLOBENUM、SET
次の表は、文字データ型間の変換ルールを示しています。
データ型 |
To CHAR |
To BINARY |
To VARCHAR\ VARBINARY |
To TEXT\ BLOB |
To ENUM\ SET |
|---|---|---|---|---|---|
CHAR |
サポート | サポート | サポート | サポート | サポート |
BINARY |
サポート | サポート | サポート | サポート | サポート |
VARCHAR、 VARBINARY |
サポート | サポート | サポート | サポート | サポート |
TEXT 大型データ型、BLOB 大型データ型 |
サポート | サポート | サポート | サポート | サポート |
ENUM、 SET |
サポート | サポート | サポート | サポート | サポート |
時間型の大分類における変換
時間データ型は以下のとおりです:
DATETIMESTAMPDATETIMETIMEYEAR
次の表は、時間型の大分類における変換の状況を示しています。
データ型 |
To DATE |
To TIMESTAMP |
DATETIME |
TIME |
YEAR |
|---|---|---|---|---|---|
DATE |
サポート | サポート | サポート | サポート | サポート |
TIMESTAMP |
サポート | サポート | サポート | サポート | サポート |
DATETIME |
サポート | サポート | サポート | サポート | サポート |
TIME |
サポート | サポート | サポート | サポート | サポート |
YEAR |
サポート | サポート | サポート | サポート | サポート |
数値型と文字型の相互変換
数値型と文字型の相互変換の仕様は、次の表のとおりです。
データ型 |
To整数型、浮動小数点数型、固定小数点数型 |
To BIT型 |
To CHAR、BINARY、VARCHAR、VARBINARY、TEXT、BLOB |
To ENUM、SET |
|---|---|---|---|---|
| 整数型、浮動小数点数型、固定小数点数型 | 各データ型間の変換ルールを参照してください。 | 各データ型間の変換ルールを参照してください。 | サポート | サポート |
BIT型 |
各種類内の変換ルールを参照してください。 | 各種類内の変換ルールを参照してください。 | サポート | サポート |
CHAR、BINARY、VARCHAR、VARBINARY、TEXT、BLOB |
サポート | サポート | 各データ型間の変換ルールを参照してください。 | サポート |
ENUM、SET |
サポート | サポート | 各データ型間の変換ルールを参照してください。 | 各データ型間の変換ルールを参照してください。 |
数値型と時系列型の相互変換
数値型と時系列型の相互変換の関係は、次の表のとおりです。
データ型 |
To整数型、浮動小数点型、固定小数点型、 BIT |
To DATE |
To DATETIME |
To TIMESTAMP |
To TIME |
To YEAR |
|---|---|---|---|---|---|---|
整数型、浮動小数点型、固定小数点型、BIT |
各データ型の変換ルールを参照してください。 | サポート | サポート | サポート | サポート | サポート |
DATE |
サポート | 主要なデータ型間の変換ルールを参照してください。 | 主要なデータ型間の変換ルールを参照してください。 | 主要なデータ型間の変換ルールを参照してください。 | 主要なデータ型間の変換ルールを参照してください。 | 主要なデータ型間の変換ルールを参照してください。 |
DATETIME |
サポート | 主要なデータ型間の変換ルールを参照してください。 | 主要なデータ型間の変換ルールを参照してください。 | 主要なデータ型間の変換ルールを参照してください。 | 主要なデータ型間の変換ルールを参照してください。 | 主要なデータ型間の変換ルールを参照してください。 |
TIMESTAMP |
サポート | 主要なデータ型間の変換ルールを参照してください。 | 主要なデータ型間の変換ルールを参照してください。 | 主要なデータ型間の変換ルールを参照してください。 | 主要なデータ型間の変換ルールを参照してください。 | 主要なデータ型間の変換ルールを参照してください。 |
TIME |
サポート | 主要なデータ型間の変換ルールを参照してください。 | 主要なデータ型間の変換ルールを参照してください。 | 主要なデータ型間の変換ルールを参照してください。 | 主要なデータ型間の変換ルールを参照してください。 | 主要なデータ型間の変換ルールを参照してください。 |
YEAR |
サポート | 主要なデータ型間の変換ルールを参照してください。 | 主要なデータ型間の変換ルールを参照してください。 | 主要なデータ型間の変換ルールを参照してください。 | 主要なデータ型間の変換ルールを参照してください。 | 主要なデータ型間の変換ルールを参照してください。 |
文字列データ型と時系列データ型間の変換
文字列データ型と時系列データ型間の変換は、次の表のとおりです。
データ型 |
To CHAR、BINARY 、VARCHAR 、VARBINARY 、TEXT 大类、 BLOB 大类 |
To ENUM、 SET |
To DATE |
To DATETIME |
To TIMESTAMP |
To TIME |
To YEAR |
|---|---|---|---|---|---|---|---|
CHAR、BINARY、VARCHAR、VARBINARY 、TEXT 大类、BLOB 大类 |
各データ型の変換ルールを参照してください。 | 各データ型の変換ルールを参照してください。 | サポート | サポート | サポート | サポート | サポート |
ENUM、 SET |
各データ型の変換ルールを参照してください。 | 各データ型の変換ルールを参照してください。 | サポート | サポート | サポート | サポート | サポート |
DATE |
サポート | サポート | 同一データ型間の変換ルールを参照してください。 | 同一データ型間の変換ルールを参照してください。 | 同一データ型間の変換ルールを参照してください。 | 同一データ型間の変換ルールを参照してください。 | 同一データ型間の変換ルールを参照してください。 |
DATETIME |
サポート | サポート | 同該データ型の変換ルールを参照してください。 | 同該データ型の変換ルールを参照してください。 | 同該データ型の変換ルールを参照してください。 | 同該データ型の変換ルールを参照してください。 | 同該データ型の変換ルールを参照してください。 |
TIMESTAMP |
サポート | サポート | 同該データ型の変換ルールを参照してください。 | 同該データ型の変換ルールを参照してください。 | 同該データ型の変換ルールを参照してください。 | 同該データ型の変換ルールを参照してください。 | 同該データ型の変換ルールを参照してください。 |
TIME |
サポート | サポート | 同該データ型の変換ルールを参照してください。 | 同該データ型の変換ルールを参照してください。 | 同該データ型の変換ルールを参照してください。 | 同該データ型の変換ルールを参照してください。 | 同該データ型の変換ルールを参照してください。 |
YEAR |
サポート | サポート | 同該データ型の変換ルールを参照してください。 | 同該データ型の変換ルールを参照してください。 | 同該データ型の変換ルールを参照してください。 | 同該データ型の変換ルールを参照してください。 | 同該データ型の変換ルールを参照してください。 |
Online DDLによる列型の上位互換変換のシナリオ
整形の変換
データ型 |
To SMALLINT |
To MEDIUMINT |
To INT |
To BIGINT |
|---|---|---|---|---|
| TINYINT | サポート | サポート | サポート | サポート |
| SMALLINT | N/A | サポート | サポート | サポート |
| MEDIUMINT | サポートなし | N/A | サポート | サポート |
| INT | サポートなし | サポートなし | N/A | サポート |
データ型 |
To USMALLINT |
To UMEDIUMINT |
To UINT |
To UBIGINT |
|---|---|---|---|---|
| UTINYINT | サポート | サポート | サポート | サポート |
| USMALLINT | N/A | サポート | サポート | サポート |
| UMEDIUMINT | サポートなし | N/A | サポート | サポート |
| UINT | サポートなし | サポートなし | N/A | サポート |
DECIMAL/DECIMALINT
DECIMAL(precision, scala) は10進数データ型を表し、precision は数値の全長、scala は小数部の桁数を表します。precision のOnline DDL時の精度範囲は [1, 9]、[10, 18]、[19, 38]、[39, 65] です。
注意
- Oracleモードでは
precisionの最大値は38です。 - MySQLモードでは
precisionの最大値は65です。
precision の長さが同一範囲内であり、かつ scala が変わらない場合、基盤となる物理ストレージは変更されず、Online DDLを使用して変更できます。例えば、DECIMAL(10, 2) から DECIMAL(12, 2) への変更は、Online DDLを使用して行えます。
最初のパラメータ
precisionの変更について、長くする場合(つまりprecisionの長さを増やす場合)は、Online DDLを使用して変更できます。例えば、DECIMAL(10, 2)からDECIMAL(12, 2)への変更は、Online DDLを使用して行えます。しかし、短くする場合(つまりprecisionの長さを減らす場合)は、Online DDLを使用して変更できず、Offline DDLを使用して変更する必要があります。区間をまたぐ場合もOffline DDLを使用して変更する必要があります。2番目のパラメータ
scalaの変更について、長くする場合も短くする場合も、Online DDLを使用することはできず、Offline DDLを使用して変更する必要があります。例えば、DECIMAL(10, 2)からDECIMAL(10, 4)への変更、またはDECIMAL(10, 2)からDECIMAL(10, 1)への変更は、Offline DDLを使用して行う必要があります。
VARCHARの可変長化
VARCHAR(x) を VARCHAR(y) に変換する場合、y の長さが x の長さ以上であれば、Online DDLを使用して列型を引き上げる変更を行えます。例えば、VARCHAR(10) を VARCHAR(20) に変換する場合、Online DDLを使用して列型を変更できます。
VARBINARY 変長
VARBINARY(x) を VARBINARY(y) に変換する場合、y の長さが x の長さ以上であれば、Online DDL を使用して列の型を上書き変更できます。例えば、VARBINARY(10) を VARBINARY(20) に変換する場合、Online DDL を使用して列の型を変更できます。
データ型
注意
LOB 列はインデックスや主キーとして使用できません。
データ型 |
To MEDIUMBLOB |
To LONGBLOB |
|---|---|---|
| BLOB | サポート | サポート |
| MEDIUMBLOB | N/A | サポート |
データ型 |
To MEDIUMTEXT |
To LONGTEXT |
|---|---|---|
| TEXT | サポート | サポート |
| MEDIUMTEXT | N/A | サポート |
VARCHAR と TINYTEXT の相互変換
データ型 |
To VARCHAR(x),x>=255 |
To TINYTEXT |
|---|---|---|
| TINYTEXT | サポート | N/A |
| VARCHAR(x),x<=255 | N/A | サポート |
VARBINARY と TINYBLOB の相互変換
データ型 |
To VARBINARY(x),x>=255 |
To TINYBLOB |
|---|---|---|
| TINYBLOB | サポート | N/A |
| VARBINARY(x),x<=255 | N/A | サポート |