一、修改键列数据类型支持的范围
主键、排序键可修改的数据类型支持 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, …]
注意:说明:
三、语法
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;