你好,我在web页面测试数据入库,新建的schema如下:
CREATE TAG process
( pid
int, pguid
string, pname
string default “”)
其中,pname字段设置了默认值为“”。
首先,入库一条数据:
INSERT VERTEX process(pid,pguid,pname) VALUES hash(“24bf7159-e0bc-49a8-bd06-0dbfabe61fea”): (3658436,“24bf7159-e0bc-49a8-bd06-0dbfabe61fea”,“hello world”);
然后,再入库数据:
NSERT VERTEX process(pid,pguid) VALUES hash(“24bf7159-e0bc-49a8-bd06-0dbfabe61fea”): (12345,“24bf7159-e0bc-49a8-bd06-0dbfabe61fea”);
第二次入库的目的是只想更新pid字段的值,而保留pname字段的值。但是在第二次入库后,发现pname的值也被默认值“”给覆盖了,这违反了我的本意。
我的问题是:
1、请问nebula就是这样设计的吗,即使存在默认值的字段没有填值也会覆盖之前入库的数据中的值?
2、如果就是这样设计的,那有办法按照我得需求,保留之前的pname字段的值吗?
你好,我再问下nebula自身有没有这样的一种机制:
insert数据,如果之前数据在数据库中已存在,那么该条插入则不作处理。
即存不存在insert vertex if not exist这种语法。
如果没有这种机制,那是否用户必须先使用查询语句查看是否已经存在该条数据,然后再自己丢弃这次insert。
Amber
5
目前IF NOT EXISTS
语法仅支持在创建schema时和用户管理时使用。在插入数据时还不能用。比如:
CREATE SPACE IF NOT EXISTS default_space
假如你一定要保存最开始插入的数据,那你可以先用fetch读下有没有这条数据,没有再做插入。
奥奥,好的,明白了,看来我需要自己用insert和fetch封装成一条符合需求的语句。
再问下如果在插入数据前先fetch判断这条数据是否存在,这个fetch的耗时对比insert操作的耗时比例大概是多少呢,如果耗时太多的话对入库性能也会有影响。
如果所有字段都没有默认值 可以直接用upsert,本质上就是fetch+insert
暂时没测试数据, 理论上 fetch也不需要有锁, 且可以用批量的方式去跑, 应该跟 insert 在一个数量级上.
upsert的锁库和只支持单条插入太影响性能了,目前insert的性能还是符合我们的业务要求的
min.wu
13
fetch是个随机读,insert是一个顺序写,估计SSD上也应该会有些差距的