为什么在将列更新为null后(向上插入的)行会消失(但插入时不会)

h6my8fg2  于 2021-06-14  发布在  Cassandra
关注(0)|答案(1)|浏览(512)

我对cassandra中的插入和更新的理解是,它们基本上是一样的。文件上也是这么说的(https://docs.datastax.com/en/cql/3.3/cql/cql_reference/cqlupdate.html?hl=upsert )
注意:与insert命令不同,update命令支持计数器。否则,更新和插入操作是相同的。
所以除了对计数器的支持之外,它们应该是相同的。
但后来我遇到了一个问题,在那里创建的行通过 update 如果我将列设置为 null ,而如果使用 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 找不到那排人。

cqlsh:test> insert into address_table (name, addresses) values ('Caroline', null);
cqlsh:test> update address_table set addresses = null where name = 'Dexter' ;
cqlsh:test> select * from address_table;

 name     | addresses
----------+-----------
 Caroline |      null
    Alice |      null

(2 rows)

有人能解释一下发生了什么事吗?
我们用的是Cassandra3.11.3

8ulbf1ek

8ulbf1ek1#

这是预期的行为。请参阅中的详细信息https://issues.apache.org/jira/browse/cassandra-14478
insert添加行标记,而update不添加行标记。这是什么意思?基本上,更新请求添加行的单个单元格,但不请求添加行本身;因此,如果稍后使用delete删除相同的单个单元格,则整行将消失。但是,“insert”不仅添加单元格,还请求添加行(这是通过“行标记”实现的)。因此,如果以后删除了所有行的单个单元格,则会保留一个空行(即,表中仍会记住现在没有内容的行的主行)。

相关问题