Kdb+含关联列的表插入失败原因及报错优化问询
Kdb+ 表插入失败问题解析
问题重现
首先创建两张表并建立关联列:
t1:([] c1:`sym?`c`b`a; c2: 10 20 30) t2:([] c3:`sym?`a`b`a`c; c4: 1 2 3 4.) update t1link:`t1!t1.c1?c3 from `t2 sym,:`x
向t1插入新数据可正常执行:
`t1 insert (`x, 22)
但向t2插入数据时出现异常:
val: t1.c1?`x `t2 insert (`x, 22.1, val) // 报错:`t1 `t2 insert (`x, 22.1, `t1!val) // 执行成功!
疑问
- 首次插入操作为何失败?通过
meta查看发现t1link列类型为j,但列中现有值的类型为-7h。 - 如何让Kdb+输出失败语句的更详细信息?
解答
1. 插入失败原因
- 执行
update t1link:t1!t1.c1?c3 fromt2时,\t1!操作会将t1.c1?c3返回的整数列表包装为**关联到t1的link类型(类型码-7h)**,因此t2的t1link`列实际存储的是带表引用的link值,而非单纯整数。 val: t1.c1?x得到的是一个普通64位整数(类型码j),与t1link列要求的-7h类型不匹配。Kdb+在插入时会严格校验列类型,单纯整数缺少关联表t1的元信息,因此抛出`t1`错误。- 而
\t1!val将整数val包装为关联t1`的link类型,与列类型完全匹配,所以插入成功。
2. 获取详细错误信息
- 在q会话中执行
\e 1开启错误追踪,报错时会输出完整调用栈,便于定位问题。 - 启动q进程时添加
-debug参数(如q -debug),可在报错时显示包含上下文的详细调试信息。
内容的提问来源于stack exchange,提问作者Xavier Z
相关产品推荐
相关产品推荐

