Cassandra CQL - 如果不等于更新(插入)

时间:2018-05-24 14:22:36

标签: if-statement cassandra cql

我有一个场景,如果(非键)字段不等于某个字符串或记录不存在,我需要更新(或插入)记录。例如,给出类似的东西:

UPDATE mytable SET firstname='John', lastname='Doe' WHERE id='1' IF lastname != 'Doe';

如果lastname当前不是'Doe',则更新它,或者如果记录不存在,则更新(插入)它。我的假设是,如果没有记录,IF条件将产生真实,但显然不是。还有其他选择吗?

2 个答案:

答案 0 :(得分:3)

在Cassandra中,UPDATE的行为与INSERT语句非常相似,如Apache CQL文档中所述:

  

“请注意,与SQL不同,UPDATE默认情况下不检查行的先前存在(除非通过IF,请参见下文):如果之前不存在,则创建行,否则更新。没有办法知道是否发生了创作或更新。“ - CQL Documentation - Update

我做了一个简单的测试,确实有效:

cqlsh:test_keyspace> select * from conditional_updating ;

id | firstname | lastname
----+-----------+----------

(0 rows)

cqlsh:test_keyspace> update conditional_updating 
                       set firstname = 'John', 
                           lastname = 'Doe' 
                       WHERE id = 1 IF lastname != 'Doe';

 [applied]
-----------
  True

cqlsh:test_keyspace> select * from conditional_updating ;

 id | firstname | lastname
----+-----------+----------
  1 |      John |      Doe

(1 rows)

cqlsh:test_keyspace> update conditional_updating 
                       set lastname = 'New' 
                       WHERE id = 1 IF lastname != 'Doe';

 [applied] | lastname
-----------+----------
     False |      Doe

请注意,使用IF条件并不是免费的。它会触发轻量级事务(LWT)(也称为Compara和SET的CAS)。这样的查询需要读取和写入,并且还需要在所有副本之间达成共识,这使得它有点繁重。

  

“但请注意,使用IF条件会产生不可忽视的性能成本(内部使用Paxos),因此应谨慎使用。” - CQL Documentation - Update

如果您有兴趣了解为什么轻量级交易在Cassandra中被视为反模式,我建议您在此处查看: Lightweight Transactions In Cassandra

答案 1 :(得分:0)

请参阅此文档,因为这是您所需要的,并且在Cassandra中 UPDAtE 如果不存在,查询将充当插入。 update with condition

示例:

SELECT h.NUMBER as TICKET, h.UNIV_NUM, h.ASSIGNEE,
       w.SUBMIT_DATE, w.TYPE
FROM dbo.HELP_DESK h LEFT JOIN
     (SELECT w.*,
             MAX(CASE WHEN w.TYPE = '16000' THEN w2.SUBMIT_DATE END) OVER (PARTITION BY w.NUMBER) as max_submit_date
      FROM dbo.WORKLOG w
     ) w
     ON h.NUMBER = w.NUMBER AND w.submit_date = w.max_submit_date
WHERE h.ASSIGNEE = 'AB049732';