Database KDB中Insert和Upsert的行为

Database KDB中Insert和Upsert的行为,database,insert,primary-key,kdb,Database,Insert,Primary Key,Kdb,我有以下表格: q) t:([s:`symbol$()] id:();id2:`int$()) 其中“s”是主键,“id”列具有常规类型。 我试图理解在“id”列中插入列表(本例中为字符串)时的以下行为: a) Upsert工作,但Insert失败 q) `t insert (`a;"gg";4) // 'type q) `t upsert (`a;"gg";4) // works b) Insert还需要登记主

我有以下表格:

           q) t:([s:`symbol$()] id:();id2:`int$())
其中“s”是主键,“id”列具有常规类型。 我试图理解在“id”列中插入列表(本例中为字符串)时的以下行为:

a) Upsert工作,但Insert失败

          q) `t insert (`a;"gg";4)     // 'type 
          q) `t upsert (`a;"gg";4)     // works
b) Insert还需要登记主键:

    q)`t insert  (`a;enlist "gg";4)    // 'length

    q)`t insert  (enlist `a;enlist "gg";4)  // works

幕后发生了什么?

我相信问题出在“gg”上——它是一个列表,因此插入会混淆您是要插入一条记录还是多条记录。这:

`t insert (`a;"g";4)
很好用。不幸的是,我不知道其他解决方法,但给出长度为1的记录列表:

`t insert (enlist `c;enlist "gg";enlist 4)

我不确定
upsert
是怎么回事,但它可能与amend的实现有关:
[;();;]

谢谢。我已经知道你提到的事了。我正试图找出上述案例。尝试以下情况以获得更多视图:1)如果您的表不是空的,则
t insert(
a;“gg”;4)可以工作。2) 切换“id”和“id2”列的数据类型,然后以下操作将起作用:
t insert(
a;4;“gg”)。另外,如果您查看案例b,我们不需要登记所有。仅登记第一个主键列(即使您有更多主键)和常规列表列(在本例中为“gg”)。我注意到的一件事是,如果一个列被声明为一个通用列表,那么它实际上从第一次插入时就收到了它的类型,因此插入
之后
meta
(a;1;1)
将说明第二列是int。我猜当第一次插入时看到列表时,类型推断失败。我经常在表中插入一条伪记录,就像所有泛型列中的
为空一样。是的,如果是单行插入,通常列从第一次插入时接收其类型。但我不认为这是唯一导致问题的原因。试试这个:q)t:([s:
symbol$()]id:
int$();id2:()]/开关id和id2列数据类型q)
t插入(
a;4;“gg”)/works。所以在本例中,它在一行中插入了“gg”。Charlie在谷歌论坛上的回复对任何感兴趣的人来说都是恰到好处的:(8月10日的回复)