KDB空表多列更新长度错误排查及自动更新方案咨询
KDB空表更新问题及自动同步方案
一、原代码错误原因及修正
错误根源
update操作误用:update用于修改表中已有行的字段值,但t1是空表(0行),没有可修改的行,导致右侧赋值(长度1)与左侧行数(0)不匹配,触发长度错误。- 冗余的
each遍历:逐个处理eTab元素既低效,也不符合空表插入数据的逻辑——空表需要批量添加行,而非逐行修改。
修正后的代码
直接使用insert批量插入符合t1结构的数据,无需遍历:
t1:([]a:();b:();c:()) t2:([]d:(1;2;3);e:("trade";"quote";"price")) eTab:exec distinct e from t2 // 构造匹配t1结构的数据集并一次性插入 insert[`t1] ([]a:count[eTab]#"KDB"; b:eTab; c:count[eTab]#"KDB")
执行后t1会生成3行数据:
q)t1 a b c ------------- "KDB" "trade" "KDB" "KDB" "quote" "KDB" "KDB" "price" "KDB"
二、实现t2变更时自动更新t1
通过KDB的**触发器(Trigger)**可实现t2的e列变更时自动同步t1,具体步骤如下:
1. 定义触发器处理函数
该函数会在t2的e列发生插入、更新或删除操作时被调用,负责同步t1的数据:
// 触发器函数:同步t1与t2的e列数据 .trigger.syncT1:{[tab;col;ops] // 清空t1旧数据 delete from `t1; // 从t2获取最新的distinct e值,插入t1 insert[`t1] ([]a:count[eTab]#"KDB"; b:eTab; c:count[eTab]#"KDB") where eTab:exec distinct e from tab; }
2. 绑定触发器到t2的e列
将触发器函数与t2的e列绑定,指定当该列发生任何操作时触发同步:
// 为t2的e列绑定触发器 .trigger[`t2;`e;.trigger.syncT1]
测试自动同步
修改t2的e列数据,观察t1是否自动更新:
// 向t2新增一行 insert[`t2] (4;"order") // 查看t1,会自动新增对应行 q)t1 a b c ------------- "KDB" "trade" "KDB" "KDB" "quote" "KDB" "KDB" "price" "KDB" "KDB" "order" "KDB"
内容的提问来源于stack exchange,提问作者CleanSock
相关产品推荐
相关产品推荐

