if-statement - Cassandra CQL - 如果不等于则更新(插入)
问题描述
我有一个场景,如果(非键)字段不等于某个字符串或记录不存在,我需要更新(或插入)记录。例如,给定以下内容:
UPDATE mytable SET firstname='John', lastname='Doe' WHERE id='1' IF lastname != 'Doe';
如果姓氏当前不是“Doe”,则更新它,或者如果记录不存在,则更新(插入)它。我的假设是,如果没有记录,IF 条件将产生 true,但显然不是。有替代方案吗?
解决方案
在 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 中的轻量级事务
推荐阅读
- javascript - jQuery 数据表与 Vue.js 有问题
- c++ - libc++ 协程的suspend_always::await_suspend 是否应该“导出”到c++experimental.lib?
- mariadb - 如何让 Debezium 自动切换到下一个 binlog
- fortran - 使用指针创建链表时出现“Fortran 运行时错误:文件结尾”问题(在 DO 循环中读取)
- mysql - 通过 Django ORM 在 MySQL 中的非二进制 LIKE
- java - 如何让我的线程按顺序运行?
- flutter - 为什么在颤振中使用 TabBar 时缺少 TabController
- java - 如何在具有多个 firebase 项目的一个应用程序中设置 firebase crashltycs
- python - 如何修复“RuntimeError: dataset.__iter__() 仅在启用急切执行时受支持。”
- c# - 如何根据条件将 Line Item 行合并到上述行