我用的是Postgres,NodeJS和Knex。
我有以下情况:
具有唯一字段的数据库表。
在NodeJS中,我有一个对象数组,我需要:
a.如果表不包含唯一id,则插入新行,或
b.如果表中确实包含唯一id,则更新其余字段。
据我所知,我有三个选择:
对数据库中是否存在每个查询进行查询,并根据响应进行更新或插入。这会消耗资源,因为每个数组项都有一个调用,还有一个插入或更新。
删除数组中id为的所有行,然后执行插入。这将意味着只有2个操作,但autoincrement字段将继续增长。
执行upsert,因为Postgres 9.5支持它。批量upsert似乎可以工作,而且只需要调用数据库。
纵观我所知道的选择,upsert似乎是最合理的选择,但它有什么缺点吗?
最佳答案
Upsert
是一种常见的方式。
另一种方法是使用单独的插入/更新操作,而且最有可能更快:
定义现有行select id from t where id in (object-ids)
(*)
通过(*)结果更新现有行
按(*)筛选数组并批量插入新行。
有关相同问题的详细信息here