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的发现,我会做一个快速测试