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