【问题标题】:Cassandra Conditional Update combined with IF EXISTSCassandra 条件更新结合 IF EXISTS
【发布时间】:2020-09-11 17:37:49
【问题描述】:

我知道在 cassandra 中可以使用条件更新(轻量级事务)。

update myTable 
set 
col1 = 'abc',
where id = 1 
IF priority < 2  

这允许我只更新具有更高优先级的行。不幸的是,当该行不存在时,该语句返回 false。是否可以将 "IF NOT EXISTS" 和 "IF" 与 OR 操作结合起来?

否则我必须对集群执行更多查询。在我的用例中,这可能是一个很大的性能问题。

【问题讨论】:

    标签: cassandra cql conditional-operator


    【解决方案1】:

    我想通了 - 不幸的是,这在 cassandra 中是不可能的。我们必须将插入和更新语句分开。

    https://issues.apache.org/jira/browse/CASSANDRA-8335

    insert ... if not exists
    update ... if priority < 2
    

    【讨论】:

      【解决方案2】:

      您可以使用 IN 运算符,假设“优先级”具有有限的(并且可能很小)允许的值集合,例如 0 和 1。通过将 NULL 值添加到集合中,查询也将成功,如果行不存在。

      您使用的是单个查询,但请注意,性能影响是不可忽略的,并且可能与使用两个查询相同或更差。

      update myTable 
      set 
      col1 = 'abc',
      where id = 1 
      IF priority IN (0, 1, NULL)
      

      【讨论】:

      • 我发现(至少在驱动程序 v3.17.0 中)这可以作为 SimpleStatement 正常工作,但它不适用于准备好的语句。至少对于 TEXT 列,IF col1='' 与 IF col1=null 的处理方式不同,但是当元组参数绑定到准备好的语句时,None 和 '' 都被序列化为相同的字节序列。
      猜你喜欢
      • 2018-02-15
      • 1970-01-01
      • 1970-01-01
      • 2012-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多