Cassandra:如何知道操作是插入还是更新
Cassandra: How to know if operation was insert or update
为了尽量减少查询次数,我在我的应用程序中只使用 UPDATE 方法:
UPDATE lp_registry.domain SET dr = ?, ud = dateOf(now()) WHERE d1 = ? AND d2 = ? AND d3 = ?
如果对应主键 d1,d2,d3 的行不存在,那么它会自动创建,这就是我想要的。
但我还想知道该行是否已插入或更新。我在 cassandra documentation 中读到过 IF EXIST 和 'applied' 结果。然而这个:
UPDATE lp_registry.domain SET dr = ?, ud = dateOf(now()) WHERE d1 = ? AND d2 = ? AND d3 = ? IF EXISTS
如果该行不存在,则不会执行操作。
有没有办法在没有(SELECT 和(插入或更新))的情况下执行 UPSERT 并跟踪行的插入或更新?
你的问题比较乱,标题说懂操作。
你说的很详细,你想要可用于插入或更新的统一查询。
在 cassandra 中更新和插入是一样的。
每次(所有列)只触发全行插入查询,如果存在,将根据主键更新。
如果不存在,将插入。
您的问题的答案是否定的,您无法确定写入是否执行了新的行插入或对现有行的更新。正如您所注意到的,您可以通过执行先读后写来自己完成此操作,但是您会在每次写入时引入性能损失。
根据设计,Cassandra 执行更新插入。这种性能优化允许 Cassandra 数据库引擎写入数据而不检查(读取)它是否已经存在。
If EXISTS
是轻量级交易的一种形式 LWT。它们通常用于乐观并发控制,并且由于隐含的先读后写而增加了延迟(高达四倍)。
为了尽量减少查询次数,我在我的应用程序中只使用 UPDATE 方法:
UPDATE lp_registry.domain SET dr = ?, ud = dateOf(now()) WHERE d1 = ? AND d2 = ? AND d3 = ?
如果对应主键 d1,d2,d3 的行不存在,那么它会自动创建,这就是我想要的。
但我还想知道该行是否已插入或更新。我在 cassandra documentation 中读到过 IF EXIST 和 'applied' 结果。然而这个:
UPDATE lp_registry.domain SET dr = ?, ud = dateOf(now()) WHERE d1 = ? AND d2 = ? AND d3 = ? IF EXISTS
如果该行不存在,则不会执行操作。
有没有办法在没有(SELECT 和(插入或更新))的情况下执行 UPSERT 并跟踪行的插入或更新?
你的问题比较乱,标题说懂操作。 你说的很详细,你想要可用于插入或更新的统一查询。
在 cassandra 中更新和插入是一样的。
每次(所有列)只触发全行插入查询,如果存在,将根据主键更新。
如果不存在,将插入。
您的问题的答案是否定的,您无法确定写入是否执行了新的行插入或对现有行的更新。正如您所注意到的,您可以通过执行先读后写来自己完成此操作,但是您会在每次写入时引入性能损失。
根据设计,Cassandra 执行更新插入。这种性能优化允许 Cassandra 数据库引擎写入数据而不检查(读取)它是否已经存在。
If EXISTS
是轻量级交易的一种形式 LWT。它们通常用于乐观并发控制,并且由于隐含的先读后写而增加了延迟(高达四倍)。