列类型变更规则
在 seekdb下进行列类型变更时,需要首先考虑表级的列类型变更规则,特别是一些数据类型的禁用场景。其次是考虑列类型变更中源数据类型和目标数据类型的变更规则。
表级列类型变更规则
禁用规则
-
外键约束
对于 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 的方式变更的同时,也需要修改索引表等相关依赖对象的 Schema,即 "用户预期数据不发生变化,但依赖对象中的 Schema 也要跟着改掉"。 - 对于
INTEGER和DecimalInt类型的列,如果它们是索引列或主键列,那么列类型增长的操作可以通过 Online DDL 的方式执行。
- 如果通过 Online DDL 的方式修改列的长度,并且该列上有索引表的情况(比如
-
在 seekdb 中,对于
LOB类型的增长,Online DDL 操作支持以下情形:- 普通列的修改。
- 作为生成列(Store/Virtual)的修改
- 被生成列依赖(Store/Virtual)的修改
- 增加
NOT NULL和CHECK约束。 - 修改原有的
NOT NULL约束。
-
对于数值数据类型,如果出现
SIGNED和UNSIGNED的转 换,在允许类型变更的情况下,需要执行 Offline 操作;对于字符数据类型,如果出现字符集和字符序 Collation 变更,在允许列类型变更的情况下,需要执行 Offline 操作。 -
当某一列被生成列引用时,允许列类型的变更操作。
列级转换规则
在 seekdb 中,所有列数类型分为三个大类,分别是数值数据类型、字符数据类型和时间数据类型。这三个大类内的转换规则是类似的,每种大类之间的变更规则也是类似的,但是也有一些特殊情况。
如下各表分别列举每种大类内部的和大类之间的转换情况。
数值数据类型大类内的转换
数值数据类型分为:
-
整型:
TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT -
浮点型:
FLOAT、DOUBLE -
定点型:
NUMBER -
二进制:
BIT
如下表格为数值数据类型大类内的转换情况。
| 数据类型 | To TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT | To FLOAT、DOUBLE | To NUMBER | To BIT |
|---|---|---|---|---|
| 整型 | 支持 | 支持 | 支持 | 支持 |
| 浮点型 | 支持 | 支持 | 支持 | 支持 |
| 定点型 | 支持 | 支持 | 支持 | 支持 |
| 二进制 | 支持 | 支持 | 支持 | 支持 |
字符数据类型大类内的转换
字符数据类型分为:
-
CHAR、VARCHAR -
BINARY、VARBINARY -
TEXT大类型:TINYTEXT、MEDIUMTEXT、TEXT、LONGTEXT -
BLOB大类型:TINYBLOB、MEDIUMBLOB、BLOB、LONGBLOB -
ENUM、SET
如下表格为字符数据类型大类内的转换情况。
| 数据类型 | To CHAR | To BINARY | To VARCHAR\ VARBINARY | To TEXT\ BLOB | To ENUM\ SET |
|---|---|---|---|---|---|
CHAR | 支持 | 支持 | 支持 | 支持 | 支持 |
BINARY | 支持 | 支持 | 支持 | 支持 | 支持 |
VARCHAR、 VARBINARY | 支持 | 支持 | 支持 | 支持 | 支持 |
TEXT大类型、 BLOB 大类型 | 支持 | 支持 | 支持 | 支持 | 支持 |
ENUM、 SET | 支持 | 支持 | 支持 | 支持 | 支持 |
时间类型大类内的转换
时间数据类型分为:
-
DATE -
TIMESTAMP -
DATETIME -
TIME -
YEAR
如下表格为时间类型大类内的转换情况。
| 数据类型 | 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) 表示一个十进制数类型,其中 precision 表示数字的总长度,scala 表示小数部分的位数。precision 在 Online DDL 时的精度区间有 [1, 9]、[10, 18]、[19, 38] 和 [39, 65]。
seekdb 下 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 进行修改。 -
对于第二个参数
scala的变化,无论是变长还是变短,都需要使用 Offline DDL 进行修改,即无法使用 Online 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 | 支持 |