为什么将更新的列更新为null后消失了(插入的)行? (但是插入时不行)

时间:2018-12-03 15:10:52

标签: cassandra cassandra-3.0

我对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

1 个答案:

答案 0 :(得分:2)

这是预期的行为。查看https://issues.apache.org/jira/browse/CASSANDRA-14478

中的详细信息
  

INSERT添加一个行标记,而UPDATE不添加。这是什么意思?基本上,UPDATE请求添加行的各个单元格,但不要求添加行本身。因此,如果以后再用DELETE删除相同的单个单元格,则整个行都会消失。但是,“ INSERT”不仅添加单元,还请求添加行(这是通过“行标记”实现的)。因此,如果稍后删除该行的所有单个单元格,则会在其后留下一个空行(即,该表中现在不包含任何内容的主行仍会被记住)。