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制約がある場合、列型の変更は禁止されます。すべてDISABLEのTriggerである場合、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 |
サポート | サポート | 各大カテゴリ内の変換ルールを参照してください。 | 各大カテゴリ内の変換ルールを参照してください。 | 各大カテゴリ内の変換ルールを参照してください。 | 各大カテゴリ内の変換ルールを参照してください。 | 各大カテゴリ内の変換ルールを参照してください。 |
オンライン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, scale) は10進数型を表し、precision は数字の全長を、scale は小数部の桁数を表します。precision のOnline DDL時の精度範囲は[1, 9]、[10, 18]、[19, 38]、[39, 65]です。
注意
- Oracleモードでは
precisionの最大値は38です。 - MySQLモードでは
precisionの最大値は65です。
precision の長さが同一範囲内であり、かつ scale が変更されない場合、基盤となる物理ストレージは変更されず、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番目のパラメータ
scaleの変更について、長くする場合も短くする場合も、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 | サポート |