entitymanager 中insert 用法_qSQL中的upsert

33b6a2a8ad9055c527efc287d947a6e6.png

qSQL与传统SQL的区别之一就是qSQL具有upsert语义(update and insert),本文主要讲解q中upsert的用法。

首先讲一下upsert与insert的区别。主要有以下四点:

一、对key表进行insert操作时,不可以插入主键值重复的记录,而upsert在插入主键值重复的记录时,会用最新的记录中主键对应的值覆盖原记录的值。

q)t:([name:`Dent`Ann`Bob`Mike] score:88 76 90 71)

q)`t insert(`Dent;77)

'insert

q)`t upsert(`Dent;77)

`t

q)t

name| score

----| -----

Dent| 77

Ann | 76

Bob | 90

Mike| 71

二、upsert可以向分区/分列表等序列化的文件追加记录,而insert不可以。例如:

q)`:d:/kdb/data/test set ([]c1:`a`b;c2:1.1 2.2)

q)`:d:/kdb/data/test  upsert(`c;3.3)

q)get `:d:/kdb/data/test

三、insert只能按名称传递,因此只能对全局表进行操作。upsert既可以按名传递又可以按值传递,因此,可以与匿名表或局域表一起使用。

q) ([]c1:`a`b;c2:10 20) upsert (`c;30)   / 匿名表

q)f:{t:([]c1:`a`b;c2:10 20);t upsert x}   / 局域表

q)f(`c;30)

四、批量插入时,二者写法不同。例如:

q)tnew:([] name:`Sarry`Mickey; score:99 68)  / list of collums

q)`t insert tnew

q)t upsert((`Prefect;46);(`Marvin;200))  / list of rows

qSQL中,对key表进行表连接时,lj、ij、ej、pj、uj都具有upsert语义,即当左表和右表具有同名的主键列时,右表的值会覆盖左表。以uj为例:

q)kt1:([k:1 2 3]v1:`a`b`c;v2:10 20 30)

q)kt2:([k:3 4]v2:300 400;v3:3.3 4.4)

q)kt1 uj kt2

k| v1 v2  v3

-| ----------

1| a  10

2| b  20

3| c  300 3.3

4|    400 4.4

更多qSQL的相关内容,请查看《kdb+中文教程》第六章。

b8bff374d3dfe874283b91b0f1a1499d.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值