在UPDATE或INSERT中更新了更新

时间:2017-03-02 06:38:15

标签: cassandra cql cqlengine

卡珊德拉supports upsert for UPDATE。也就是说,如果表中不存在update语句中提供的密钥;它暗示为插入。有没有办法从更新查询的返回代码中了解更新是否导致更新或插入。我们宁愿在没有Cassandra的额外阅读的情况下检测到这一点。

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

2 个答案:

答案 0 :(得分:3)

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

因此更新声明将是:

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

表示人,名称 id 是列名。

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

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

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

答案 1 :(得分:1)

简短回答:所有Cassandra写的都是upserts,他们在写之前没有也无法检查数据库的状态。

更长的答案:知道是否设置了一个值需要从Cassandra读取,这意味着如果你想知道当你upsert时是否存在某些东西意味着你最终必须在写入之前进行反阅读模式。

基本上所有需要此类有状态信息的数据模型都需要承担性能损失。最好的办法是找出构建代码的另一种方法。如果你真的需要知道差异,你可以尝试Paxos支持,如果不存在样式请求,但知道它们也需要付出代价。