有奖捉虫:办公协同&微信生态&物联网文档专题 HOT
TDSQL-H LibraDB 支持修改主键、排序键和分区键的数据类型。本文为您介绍如何修改数据类型、修改数据类型支持的范围和修改数据类型的功能限制。

修改键列数据类型支持的范围

主键、排序键可修改的数据类型支持 Int 类型、UInt 类型、Float 类型、Int 类型与 UInt 类型交叉四种场景,分区键可修改的数据类型支持 Int 类型、UInt 类型、Int 类型与 UInt 类型交叉三种场景。 修改数据类型仅支持从小类型修改为大类型,具体支持范围如下:
Int 类型:Int8、Int16 、Int32、Int64
UInt 类型:UInt8、UInt16、UInt32、UInt64
Float 类型:Float32、Float64
Int 类型与 UInt 类型交叉:
UInt8、Int16、Int32、Int64
UInt16、Int32、Int64
UInt32、Int64

使用限制

某些场景下,会使用主键或排序键作为 ShardingKey,并且通过 CityHash64 的函数进行数据写入时负载均衡。针对该类场景,同样的数据在修改数据类型前后数据类型不同,计算出来的 CityHash64 的值也不同,导致相同的数据可能存储在不同节点上,造成数据异常。
针对该场景,如果使用 TDSQL-H LibraDB 的 CDC 能力将源端数据同步至 TDSQL-H LibraDB,修改源端数据类型,可保证相同数据存储在同一节点上,因为 CDC 同步任务会将 ShardingKey 各种数据类型均转换为 String 类型。
针对该场景,如果创建表和修改数据类型均在 TDSQL-H LibraDB 侧操作,创建表时推荐使用以下语句定义 ShardingKey。
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER default_cluster]
(
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
...
) ENGINE = Distributed(cluster, database, table, cityHash64(toString(tuple(主键列或排序键列列表))))
[PARTITION BY expr]
ORDER BY expr
[PRIMARY KEY expr]
[SAMPLE BY expr]
[SETTINGS name=value, ...]
说明
创建表时,一般不需要指定主键,只要指定排序键即可。当没有指定主键时,排序键则同时作为主键。
当同时指定主键和排序键时,主键必须是排序键的前缀。
分区键不支持指定数据类型为 Float 的列。

修改键列数据类型

语法

ALTER TABLE [db.]table_name [ON CLUSTER default_cluster] modify column column_name type;

参数说明

db.:可选,指定数据库的名称,默认为当前选择的数据库。
table_name:必填,表名。
ON CLUSTER default_cluster:可选,增加 ON CLUSTER default_cluster 可在 default_cluster 集群的所有服务器上创建库表。
column_name:必填,待修改的主键列名。
type:必填,待修改的数据类型。

使用示例

# 用户 A 表中主键为 id,是一个递增序列,原始主键类型为 UInt32 类型,但是随着数据的增多,UInt32 已经存在不下当前数据,此时需要修改主键类型扩大数据存储空间,用户可将 A 表的主键 id 从 UInt32 类型修改成 UInt64。
ALTER TABLE testdb.A ON CLUSTER default_cluster modify column id UInt64;