我有一个场景,如果(非键)字段不等于某个字符串或记录不存在,我需要更新(或插入)记录。例如,给出类似的东西:
UPDATE mytable SET firstname='John', lastname='Doe' WHERE id='1' IF lastname != 'Doe';
如果lastname当前不是'Doe',则更新它,或者如果记录不存在,则更新(插入)它。我的假设是,如果没有记录,IF条件将产生真实,但显然不是。还有其他选择吗?
答案 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';