Cassandra 根据时间戳更新或插入

问题描述 投票:0回答:2

我正在尝试编写一个查询,以便

  1. 如果主键与行不匹配,则插入新行
  2. 如果匹配一行,仅当提供的时间戳晚于lastTimestamp列值时才更新值

这里的困难(如果我错了,请纠正我)是我无法使用 Cassandra 的内置“USE TIMESTAMP”功能,因为请求提供的时间戳几乎肯定低于创建新行时的默认时间戳,因此它将无法创建新行。

因此我只能创建一个新列来存储时间戳。然后我有一个 OR 条件要满足:“if lastTimestamp == null OR lastTimestamp < timestamp", but unfortunately Cassandra doesn't support the "OR" logic in IF clause.

我能想到的一个替代方案是,我总是通过“INSERT IF NOT EXIST”创建一个新行,并填充lastTimestamp = 0。然后应用“如果时间戳更大则更新”操作。但这本质上是两写比一写。还有其他可能的解决方案吗?

cassandra insert conditional-statements cql
2个回答
2
投票

在插入/更新/删除时,您需要指定以微秒为单位的时间戳。

简单的方法是将时间戳(以毫秒为单位)乘以 1000

示例:

INSERT INTO data(id, map) VALUES('123-123-12321', {'object2' : {value : '2', timestamp : '2017-09-09 16:24:06.197000+0000'}}) USING TIMESTAMP 1504952646912000;

这里 1504952646912000 是从 1504952646912 毫秒转换而来的以微秒为单位的时间戳


0
投票

对于在

USING TIMESTAMP XXXX
子句之后使用
WHERE
的 UPDATE 命令不起作用。

正确的更新语法:

UPDATE table_name USING TIMESTAMP 1735388391000000
SET column_name_1 = {value} 
WHERE column_name_2 = {value}

请参阅时间戳值Cassandra官方文档

© www.soinside.com 2019 - 2024. All rights reserved.