首页 > 解决方案 > Cassandra CQL - 如果不等于则更新(插入)

问题描述

我有一个场景,如果(非键)字段不等于某个字符串或记录不存在,我需要更新(或插入)记录。例如,给定以下内容:

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

如果姓氏当前不是“Doe”,则更新它,或者如果记录不存在,则更新(插入)它。我的假设是,如果没有记录,IF 条件将产生 true,但显然不是。有替代方案吗?

标签: if-statementcassandracql

解决方案


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

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

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

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 文档 - 更新

如果您有兴趣了解为什么轻量级事务在 Cassandra 中被视为反模式,我鼓励您在这里查看: Cassandra 中的轻量级事务


推荐阅读