【问题标题】:Multiple IF conditions in Cassandra lightweight transactions/CASCassandra 轻量级事务/CAS 中的多个 IF 条件
【发布时间】:2020-07-07 21:33:36
【问题描述】:

所以我试图在 Cassandra 中进行 CAS(比较和设置)类型操作,我只想在特定的非主键列是 NULL< ? 时进行数据更新其中? 由客户端代码提供。

我该怎么做?以下类似的方法不起作用

UPDATE my_dbs.foo SET col1=5 WHERE id=1 IF (col1 = NULL OR col1 < 4);

我得到的错误类似于以下内容:

SyntaxException: <ErrorMessage code=2000 [Syntax error in CQL query] message="line 1:149 no viable alternative at input '(' (...

如何在 Cassandra 2.0/2.1 中执行此操作?

【问题讨论】:

    标签: cql cassandra-2.1 paxos


    【解决方案1】:

    在 IF 子句中不支持 OR 逻辑运算符。来自文档here

    简介:

    更新 keyspace_name.table_name

    使用选项和选项

    SET 赋值,赋值,...

    WHERE row_specification

    IF column_name = literal AND column_name = literal 。 . .

    如果存在

    也许要么做两个单独的更新来覆盖这两种情况,要么在插入时用默认的非空值填充 col1,因为这不会损害您的应用程序逻辑。

    【讨论】:

    • 非常感谢,后者听起来像是获得不太昂贵的读取的更好选择 - 您的前一个选择很大程度上取决于读取的一致性级别,imo。
    • @Nishant Kelkar 不客气。是的,我同意你提到的第一个选项。这要么是昂贵的读取,要么是应用层中的某种强制执行。
    【解决方案2】:

    现在你可以用几个“OR”来做 IF 条件。只需使用if field in (value1, value2)

    UPDATE my_dbs.foo SET col1=5 WHERE id=1 IF col1 in (null, 1, 2, 3);

    【讨论】:

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