如果记录不存在,我想在单个操作中执行插入操作,或者仅在行的字段具有特定值时进行更新。
想象一下表格:
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) 操作时,INSERT
和 UPDATE
之间的语法和功能是不同的 em>相同。
举个例子,IF NOT EXISTS
条件对于 INSERT
有效,但对于 UPDATE
无效。另一方面,IF EXISTS
对于 UPDATE
有效,但对于 INSERT
无效。
其次,OR
在 CQL WHERE
或 CAS 操作条件中不是有效的运算符。
第三,将 UPDATE
与 IF EXISTS
一起使用会短路任何后续条件。因此,UPDATE
可以使用IF EXISTS
或IF(条件)[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/