GridDB TimeSeries 为什么不接受 TIMESTAMP(6) 主键?
数据小许
结论
报错表明,GridDB 创建 meter_3 这个 TimeSeries 容器时,不接受 TIMESTAMP(6) 作为 rowkey(主键)类型。仅凭这条错误,无法确定限制适用于哪些 GridDB 版本,也无法判断其他容器类型或精度设置是否支持微秒时间戳。请先核对当前版本对 TimeSeries rowkey 类型和精度的要求。
排查与处理
建表语句将带小数秒精度的时间戳设为主键:
CREATE TABLE meter_3
(
timestamp TIMESTAMP(6) PRIMARY KEY,
kwh DOUBLE,
temp DOUBLE
) USING TIMESERIES;
返回信息中的关键部分是:
[60015:DS_DS_SCHEMA_INVALID] Execute SQL failed
(reason=CREATE TABLE failed (reason=Type of rowkey not supported)]
这说明建表在 schema 校验阶段失败,原因是 rowkey 类型不受支持。可以按以下顺序排查:
-
查看当前 GridDB 版本的 SQL 文档,确认 TimeSeries 的 rowkey 是否支持
TIMESTAMP(6),以及该版本支持的时间戳精度。 -
如果该版本要求使用默认精度的
TIMESTAMP,可以先去掉(6),验证能否建表:CREATE TABLE meter_3 ( timestamp TIMESTAMP PRIMARY KEY, kwh DOUBLE, temp DOUBLE ) USING TIMESERIES;这是一种用于验证 rowkey 精度限制的候选写法,是否可用仍需以当前版本的文档和实际执行结果为准。
-
如果业务必须保留微秒信息,可以考虑将微秒部分单独存入数值列。同时要确认降低时间戳精度后,多条记录是否可能映射到同一个 rowkey。若可能发生冲突,就需要选择支持业务唯一键的数据模型,并先核对该模型是否符合所用 GridDB 版本的语法和能力。
注意事项
不要因为把列声明改为 TIMESTAMP,就认为微秒精度仍会保留。默认精度及其行为需要按当前版本确认。如果降低精度会合并不同采样点,单独增加微秒字段也无法解决 rowkey 冲突。
备注:内容仅供参考。
