在MySQL中,我可以这样做:
-- post_id-user_id is unique pair
INSERT INTO userviews(post_id, user_id, view_count)
VALUES(1,1,1),(2,1,1),(3,1,1),(4,1,1)
ON DUPLICATE KEY UPDATE
view_count = view_count + 1;或者在PostgreSQL中:
INSERT INTO userviews(post_id, user_id, view_count)
VALUES(1,1,1),(2,1,1),(3,1,1),(4,1,1)
ON CONFLICT DO UPDATE SET view_count = view_count + 1;如何在Tarantool中做这样的事情?(目前我正在使用Tarantool的库在循环中进行upsert ):
import "github.com/tarantool/go-tarantool"
type AX []interface{}
...
for ... {
conn.Upsert(`userviews`, tuple, AX{AX{`+`,viewCountColumn, 1}})
}发布于 2021-06-22 02:35:51
我猜你要解决的问题是关于性能的。朴素的变体(执行一个操作,等待响应,继续下一个操作)将最多提供大约(1 /网络RTT) RPS :对于1ms RTT,它大约是1000RPS。
有以下选项:
,从版本2开始就可以使用它。)
你也可以在服务器端不使用函数的情况下使用'eval‘操作,但它需要’server‘上的'execute’权限,因此通常不鼓励使用(除了测试和实验目的)。
发布于 2021-06-22 17:55:23
请注意,upsert()的工作方式与MySQL的ON DUPLICATE KEY UPDATE不同。与MySQL不同,它只检查主键的唯一性,而忽略所有其他辅助唯一索引。我不确定这是否是您的情况,但是如果您需要复制MySQL的确切行为并更新条目,而不管主键或任何辅助唯一索引上是否存在重复项,我发现的唯一合适的方法是编写一个Lua函数,该函数首先尝试插入元组,如果操作失败并返回错误代码3(唯一索引中存在重复的键),它将执行更新。
(不确定,但也许您也可以使用Tarantool/SQL,它从版本2开始就在tarantool中可用。)
不幸的是,它还不支持UPSERT:https://github.com/tarantool/tarantool/issues/5732
https://stackoverflow.com/questions/68069443
复制相似问题