Cassandra 插入/更新(如果不存在或字段=值)

标签 cassandra conditional-statements cql upsert

如果记录不存在,我想在单个操作中执行插入操作,或者仅在行的字段具有特定值时进行更新。

想象一下表格:

CREATE TABLE (id VARCHAR PRIMARY KEY, field_a VARCHAR, field_b VARCHAR);

是否可以有类似的东西:

UPDATE my_table SET field_a='test' WHERE id='an-id' IF NOT EXISTS OR IF field_b='AVALUE';

在单个语句上执行 INSERT/UPDATE,如果 field_b 具有值 AVALUE 则插入记录,或者如果行尚不存在但在中则创建新行如果表中的某一行的 field_b 具有不同的值,则更新失败。

最佳答案

UPDATE my_table SET field_a='test' WHERE id='an-id'
IF NOT EXISTS OR IF field_b='AVALUE';

这里有一些细微差别。首先,重要的是要记住,在 CQL 中执行比较和设置 (CAS) 操作时,INSERTUPDATE 之间的语法和功能是不同的 em>相同。

举个例子,IF NOT EXISTS 条件对于 INSERT 有效,但对于 UPDATE 无效。另一方面,IF EXISTS 对于 UPDATE 有效,但对于 INSERT 无效。

其次,OR 在 CQL WHERE 或 CAS 操作条件中不是有效的运算符。

第三,将 UPDATEIF EXISTS 一起使用会短路任何后续条件。因此,UPDATE可以使用IF EXISTSIF(条件)[AND(另一个条件)] ,但不是两者。

考虑到这些点,这里的一种方法似乎是将语句分成两部分:

INSERT INTO my_table (id,field_a) VALUES ('a1','test') IF NOT EXISTS;

还有:

UPDATE my_table SET field_a='test' WHERE id='an-id' IF field_b='AVALUE';

这些都是有效的 CQL。然而,这对这种情况并没有真正的帮助。另一种方法是在应用程序端构建此逻辑。从技术上讲,先读后写方法被认为是 Cassandra 中的反模式,由于使用轻量级事务,内置 CAS 操作无法承受。

也许类似 SELECT field_a,field_b FROM my_table WHERE id='an-id'; 就足以回答它是否存在以及 field_b 的值是什么是,从而触发额外的写入?这里可能存在竞争条件,因此我会仔细检查业务需求,看看这样的方法是否可行。

关于Cassandra 插入/更新(如果不存在或字段=值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70940525/

相关文章:

hadoop - 如何在单个 Hadoop 作业中输出到多个 Cassandra 列族?

database - Cassandra DB 中列族的性能

Python-Redis : Best practice serializing objects for storage in Redis

cassandra - CQL:如何检查键空间是否存在?

java - 使用java从cassandra读取数据

elasticsearch - 有一些工具可以将Elasticsearch与Apache Cassandra链接吗?

cassandra - 在 Mac 上启动 Cassandra

jquery - if css(background-position) jquery 条件语句

mysql - 我可以设置一个条件来过滤我的 COUNT 子句吗?数据库

shell - 根据条件无限循环运行具有 While 条件的 shell 脚本