0

Cassandra支持UPDATE. 也就是说,如果更新语句中提供的键在表中不存在;它被暗示为插入。如果更新导致更新或插入,有没有办法从更新查询的返回代码中知道。我们宁愿在不从 Cassandra 额外读取的情况下检测到这一点。

我们有一个场景,我们有一个非常高吞吐量的应用程序,其中 99% 的事件导致插入,但非常小的块导致更新。一旦更新,我们会想要执行一些额外的检查并触发一些。

4

2 回答 2

3

您可以在更新语句的末尾添加IF EXITS

所以更新语句将是:

UPDATE person SET name = 'xxxxx' WHERE id = '16843158' IF exists;

对于person 和nameid是列名。

如果行退出,则返回 True,否则返回 False。使用它,您可以创建一个检查,然后“执行一些额外的检查并触发一些”。如果行不退出,这也不会插入任何内容。

请检查 true/false 是作为 Row 的列还是作为布尔值返回,因为我只在 cqlsh 中检查了这一点。

谈论Java。在 cqlsh 中,它显示为列输出。

于 2017-03-02T07:46:19.970 回答
1

简短回答:所有 Cassandra 写入都是 upsert,它们不会也无法在写入之前检查数据库的状态。

更长的答案:知道是否设置了值需要从 Cassandra 读取,这意味着如果您想知道在 upsert 时是否存在某些内容,则意味着您最终必须在写入之前执行读取的反模式。

基本上所有需要这种状态信息的数据模型都需要接受性能惩罚。最好的办法是找出另一种构建代码的方法。如果你真的需要知道区别,你可以尝试 Paxos 支持,如果不存在样式请求,但知道它们也是有代价的。

于 2017-03-02T07:21:44.237 回答