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;