Cassandra支持UPDATE
. 也就是说,如果更新语句中提供的键在表中不存在;它被暗示为插入。如果更新导致更新或插入,有没有办法从更新查询的返回代码中知道。我们宁愿在不从 Cassandra 额外读取的情况下检测到这一点。
我们有一个场景,我们有一个非常高吞吐量的应用程序,其中 99% 的事件导致插入,但非常小的块导致更新。一旦更新,我们会想要执行一些额外的检查并触发一些。
您可以在更新语句的末尾添加IF EXITS。
所以更新语句将是:
UPDATE person SET name = 'xxxxx' WHERE id = '16843158' IF exists;
对于表person 和name,id是列名。
如果行退出,则返回 True,否则返回 False。使用它,您可以创建一个检查,然后“执行一些额外的检查并触发一些”。如果行不退出,这也不会插入任何内容。
请检查 true/false 是作为 Row 的列还是作为布尔值返回,因为我只在 cqlsh 中检查了这一点。
谈论Java。在 cqlsh 中,它显示为列输出。
简短回答:所有 Cassandra 写入都是 upsert,它们不会也无法在写入之前检查数据库的状态。
更长的答案:知道是否设置了值需要从 Cassandra 读取,这意味着如果您想知道在 upsert 时是否存在某些内容,则意味着您最终必须在写入之前执行读取的反模式。
基本上所有需要这种状态信息的数据模型都需要接受性能惩罚。最好的办法是找出另一种构建代码的方法。如果你真的需要知道区别,你可以尝试 Paxos 支持,如果不存在样式请求,但知道它们也是有代价的。