我对Cassandra中的插入和更新的理解是,它们基本上是同一回事。这也是文档所说的(https://docs.datastax.com/en/cql/3.3/cql/cql_reference/cqlUpdate.html?hl=upsert)
注意:与INSERT命令不同,UPDATE命令支持计数器。否则,UPDATE和INSERT操作是相同的。
因此,除了对计数器的支持外,它们应该相同。
但是随后我遇到一个问题:如果将列设置为update
,则通过null
创建的行会消失,而如果使用{{1}创建行,则不会发生这种情况}。
insert
如果我跳过首先创建一行的单独步骤,也会发生同样的事情。使用cqlsh:test> CREATE TABLE IF NOT EXISTS address_table (
... name text PRIMARY KEY,
... addresses text,
... );
cqlsh:test> insert into address_table (name, addresses) values ('Alice', 'applelane 1');
cqlsh:test> update address_table set addresses = 'broadway 2' where name = 'Bob' ;
cqlsh:test> select * from address_table;
name | addresses
-------+-------------
Bob | broadway 2
Alice | applelane 1
(2 rows)
cqlsh:test> update address_table set addresses = null where name = 'Alice' ;
cqlsh:test> update address_table set addresses = null where name = 'Bob' ;
cqlsh:test> select * from address_table;
name | addresses
-------+-----------
Alice | null
(1 rows)
可以创建具有insert
值的行,但是如果使用null
则找不到该行。
update
有人可以解释发生了什么事吗?
我们正在使用Cassandra 3.11.3
答案 0 :(得分:2)
这是预期的行为。查看https://issues.apache.org/jira/browse/CASSANDRA-14478
中的详细信息INSERT添加一个行标记,而UPDATE不添加。这是什么意思?基本上,UPDATE请求添加行的各个单元格,但不要求添加行本身。因此,如果以后再用DELETE删除相同的单个单元格,则整个行都会消失。但是,“ INSERT”不仅添加单元,还请求添加行(这是通过“行标记”实现的)。因此,如果稍后删除该行的所有单个单元格,则会在其后留下一个空行(即,该表中现在不包含任何内容的主行仍会被记住)。