Kdb+ Tick架构中trade表无法设为键表导致upsert重复插入问题
Kdb+ 键表创建失败与upsert重复插入问题解决
问题根源
你用trade:([]time:timespan$();sym:symbol$();price:float$();size:long$())定义的是普通表(类型98h),而非键表(99h)。键表需要显式声明键列,你没遵循键表的语法规则,再加上tickerplant要求time为timespan类型且作为首列的限制,导致无法实现按唯一键更新的需求,最终upsert只能重复插入数据。
正确创建键表的方法
要创建符合tickerplant要求的键表,需用键表专属语法:([键列定义] 值列定义)。行情场景下通常用time+sym作为复合唯一键,定义如下:
trade:([time:`timespan$();sym:`symbol$()] price:`float$();size:`long$())
执行type trade会返回99h,确认是键表类型。这个定义完全满足tickerplant对time列的要求——time是首列且为timespan类型。
验证upsert的更新效果
插入重复键的数据测试:
// 第一次插入 trade upsert (`timespan$"00:00:01";`IBM;150.2;100) // 第二次用相同time+sym更新数据 trade upsert (`timespan$"00:00:01";`IBM;150.5;120)
此时查询trade会发现,对应time和sym的行只有一行,且price和size是最新的更新值,不会出现重复插入的情况。
可选的单键定义
如果你的业务逻辑中time单独作为唯一键,也可以这样定义:
trade:([time:`timespan$()] sym:`symbol$();price:`float$();size:`long$())
根据实际业务场景选择合适的键组合即可。
内容的提问来源于stack exchange,提问作者works
相关产品推荐
相关产品推荐

