跳到主要内容

列类型变更规则

在 seekdb下进行列类型变更时,需要首先考虑表级的列类型变更规则,特别是一些数据类型的禁用场景。其次是考虑列类型变更中源数据类型和目标数据类型的变更规则。

表级列类型变更规则

禁用规则

  • 外键约束

    对于 Online DDL 和 Offline DDL,除以下特殊情况(需要注意,所涉及的类型修改只改变显示精度,而不改变存储结构)的其他场景都不支持修改外键列类型。

    • 如果列的数据类型是 FLOAT(m,n),则支持更改精度大小,但不支持 SIGNEDUNSIGNED 的互相转换。

    • 如果列的数据类型是 DOUBLE(m,n),则支持更改精度大小,但不支持 SIGNEDUNSIGNED 的互相转换。

    • 如果列的数据类型是 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 也要跟着改掉"
    • 对于 INTEGERDecimalInt 类型的列,如果它们是索引列或主键列,那么列类型增长的操作可以通过 Online DDL 的方式执行。
  • 在 seekdb 中,对于 LOB 类型的增长,Online DDL 操作支持以下情形:

    • 普通列的修改。
    • 作为生成列(Store/Virtual)的修改
    • 被生成列依赖(Store/Virtual)的修改
    • 增加 NOT NULLCHECK 约束。
    • 修改原有的 NOT NULL 约束。
  • 对于数值数据类型,如果出现 SIGNEDUNSIGNED 的转换,在允许类型变更的情况下,需要执行 Offline 操作;对于字符数据类型,如果出现字符集和字符序 Collation 变更,在允许列类型变更的情况下,需要执行 Offline 操作。

  • 当某一列被生成列引用时,允许列类型的变更操作。

列级转换规则

在 seekdb 中,所有列数类型分为三个大类,分别是数值数据类型、字符数据类型和时间数据类型。这三个大类内的转换规则是类似的,每种大类之间的变更规则也是类似的,但是也有一些特殊情况。

如下各表分别列举每种大类内部的和大类之间的转换情况。

数值数据类型大类内的转换

数值数据类型分为:

  • 整型:TINYINTSMALLINTMEDIUMINTINTBIGINT

  • 浮点型:FLOATDOUBLE

  • 定点型:NUMBER

  • 二进制:BIT

如下表格为数值数据类型大类内的转换情况。

数据类型To TINYINT、SMALLINT、MEDIUMINT、INT、BIGINTTo FLOAT、DOUBLETo NUMBERTo BIT
整型支持支持支持支持
浮点型支持支持支持支持
定点型支持支持支持支持
二进制支持支持支持支持

字符数据类型大类内的转换

字符数据类型分为:

  • CHARVARCHAR

  • BINARYVARBINARY

  • TEXT 大类型:TINYTEXTMEDIUMTEXTTEXTLONGTEXT

  • BLOB 大类型:TINYBLOBMEDIUMBLOBBLOBLONGBLOB

  • ENUMSET

如下表格为字符数据类型大类内的转换情况。

数据类型To CHARTo BINARYTo VARCHAR\ VARBINARYTo TEXT\ BLOBTo ENUM\ SET
CHAR支持支持支持支持支持
BINARY支持支持支持支持支持
VARCHARVARBINARY支持支持支持支持支持
TEXT大类型、 BLOB 大类型支持支持支持支持支持
ENUMSET支持支持支持支持支持

时间类型大类内的转换

时间数据类型分为:

  • DATE

  • TIMESTAMP

  • DATETIME

  • TIME

  • YEAR

如下表格为时间类型大类内的转换情况。

数据类型To DATETo TIMESTAMPDATETIMETIMEYEAR
DATE支持支持支持支持支持
TIMESTAMP支持支持支持支持支持
DATETIME支持支持支持支持支持
TIME支持支持支持支持支持
YEAR支持支持支持支持支持

数值型大类和字符型大类间的转换

数值型大类和字符型大类间的转换情况如下表所示。

数据类型To 整型、浮点型、定点型To BIT 类型To CHAR、BINARY、 VARCHAR 、VARBINARY、 TEXT 大类、 BLOB 大类To ENUM、SET
整型、浮点型、定点型参见大类内的转换规则。参见大类内的转换规则。支持支持
BIT 类型参见大类内的转换规则。参见大类内的转换规则。支持支持
CHARBINARYVARCHARVARBINARYTEXT 大类、 BLOB 大类支持支持参见大类内的转换规则。支持
ENUMSET支持支持参见大类内的转换规则。参见大类内的转换规则。

数值型大类和时间大类间的转换

数值型大类和时间大类间的转换情况如下表所示。

数据类型To 整型、浮点型、定点型、BITTo DATETo DATETIMETo TIMESTAMPTo TIMETo YEAR
整型、浮点型、定点型、BIT参见大类内的转换规则。支持支持支持支持支持
DATE支持参见大类内的转换规则。参见大类内的转换规则。参见大类内的转换规则。参见大类内的转换规则。参见大类内的转换规则。
DATETIME支持参见大类内的转换规则。参见大类内的转换规则。参见大类内的转换规则。参见大类内的转换规则。参见大类内的转换规则。
TIMESTAMP支持参见大类内的转换规则。参见大类内的转换规则。参见大类内的转换规则。参见大类内的转换规则。参见大类内的转换规则。
TIME支持参见大类内的转换规则。参见大类内的转换规则。参见大类内的转换规则。参见大类内的转换规则。参见大类内的转换规则。
YEAR支持参见大类内的转换规则。参见大类内的转换规则。参见大类内的转换规则。参见大类内的转换规则。参见大类内的转换规则。

字符型大类和时间大类间的转换

字符型大类和时间大类间的转换情况如下表所示。

数据类型To CHAR、BINARY 、VARCHAR 、VARBINARY 、TEXT 大类、 BLOB 大类To ENUM、 SETTo DATETo DATETIMETo TIMESTAMPTo TIMETo YEAR
CHARBINARYVARCHARVARBINARYTEXT 大类、BLOB 大类参见大类内的转换规则。参见大类内的转换规则。支持支持支持支持支持
ENUMSET参见大类内的转换规则。参见大类内的转换规则。支持支持支持支持支持
DATE支持支持参见大类内的转换规则。参见大类内的转换规则。参见大类内的转换规则。参见大类内的转换规则。参见大类内的转换规则。
DATETIME支持支持参见大类内的转换规则。参见大类内的转换规则。参见大类内的转换规则。参见大类内的转换规则。参见大类内的转换规则。
TIMESTAMP支持支持参见大类内的转换规则。参见大类内的转换规则。参见大类内的转换规则。参见大类内的转换规则。参见大类内的转换规则。
TIME支持支持参见大类内的转换规则。参见大类内的转换规则。参见大类内的转换规则。参见大类内的转换规则。参见大类内的转换规则。
YEAR支持支持参见大类内的转换规则。参见大类内的转换规则。参见大类内的转换规则。参见大类内的转换规则。参见大类内的转换规则。

Online DDL 列类型向上转换场景

整形的转换

数据类型To SMALLINTTo MEDIUMINTTo INTTo BIGINT
TINYINT支持支持支持支持
SMALLINTN/A支持支持支持
MEDIUMINT不支持N/A支持支持
INT不支持不支持N/A支持
数据类型To USMALLINTTo UMEDIUMINTTo UINTTo UBIGINT
UTINYINT支持支持支持支持
USMALLINTN/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 MEDIUMBLOBTo LONGBLOB
BLOB支持支持
MEDIUMBLOBN/A支持
数据类型To MEDIUMTEXTTo LONGTEXT
TEXT支持支持
MEDIUMTEXTN/A支持

VARCHAR 与 TINYTEXT 互相转换

数据类型To VARCHAR(x),x>=255To TINYTEXT
TINYTEXT支持N/A
VARCHAR(x),x<=255N/A支持

VARBINARY 与 TINYBLOB 互相转换

数据类型To VARBINARY(x),x>=255To TINYBLOB
TINYBLOB支持N/A
VARBINARY(x),x<=255N/A支持