If statement Cassandra CQL-如果不等于

If statement Cassandra CQL-如果不等于,if-statement,cassandra,cql,If Statement,Cassandra,Cql,我有一个场景,如果(非键)字段不等于某个字符串或记录不存在,我需要更新(或插入)记录。例如,假设: updatemytable SET firstname='John',lastname='Doe'其中id='1'如果lastname!='Doe' 如果lastname当前不是“Doe”,则更新它,或者如果记录不存在,则更新(插入)它。我的假设是,如果没有记录,IF条件将产生true,但显然不是。有其他选择吗?请参考本文档,因为这是您需要的,如果不存在,请在Cassandra更新中作为插入。

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

updatemytable SET firstname='John',lastname='Doe'其中id='1'如果lastname!='Doe'


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

请参考本文档,因为这是您需要的,如果不存在,请在Cassandra更新中作为插入。

示例:

UPDATE keyspace_name.table_name
USING option AND option
SET assignment, assignment, ...
WHERE row_specification 
IF column_name = literal AND column_name = literal . . . 
IF EXISTS

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

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

我做了一个简单的测试,它确实起了作用:

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
请注意,如果发动机罩下的
条件不可用,则使用
会触发轻量级事务(LWT)(也称为CAS,用于比较和设置)。这样的查询需要读和写操作,还需要在所有副本之间达成一致意见,这使得查询有点繁琐

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


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

我已经提到了该文档,它没有解释我描述的场景。如果我运行我最初发布的语句
updatemytable SET firstname='John',lastname='Doe'WHERE id='1'如果lastname!='Doe',如果id为='1'的记录不存在,则不会创建该记录。您缺少if EXISTS检查,该检查将为您的条件生成true或false。如果if EXISTS,我不相信您可以同时使用这两个选项。我说的和您上面所说的非常一样,您可以使用,但您没有使用它。我认为我们不在同一页上。我试图实现的是一个语句,它可以实现1)条件IF更新记录或2)insert(如果不存在)。理想情况下,我不想把它分成两条语句。我不明白为什么我的更新没有插入一条不存在的记录。我尝试了与上面相同的方法,但[applied]总是错误的。您运行的是什么版本的cassandra?我的测试是在3.11.2上进行的,尽管这不会有什么不同。如果你愿意,我可以用你的版本做一个测试。我使用的是2.2版。我对3.0.x运行了相同的查询,它可以像你说的那样工作,但不适用于2.2版。如果你能确认一下就好了。奇怪的是,我确信它在某个时候对2.2有效,一旦我有机会确认你关于2.2的发现,我会做一个快速测试