【问题标题】:Why does a (upserted) row disappear after updating the column to null? (But not when it's been inserted)为什么将列更新为空后(插入的)行会消失? (但不是在插入时)
【发布时间】:2019-05-04 21:50:24
【问题描述】:

我对 Cassandra 中的插入和更新的理解是,它们基本上是同一回事。这也是文档所说的(https://docs.datastax.com/en/cql/3.3/cql/cql_reference/cqlUpdate.html?hl=upsert

注意:与 INSERT 命令不同,UPDATE 命令支持计数器。否则,UPDATE 和 INSERT 操作是相同的。

所以除了对计数器的支持之外,它们应该是相同的。

但后来我遇到了一个问题,如果我将列设置为null,通过update 创建的行将消失,而如果使用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)

有人可以解释发生了什么吗?

我们正在使用 Cassandra 3.11.3

【问题讨论】:

  • 在最后一种情况下,您不插入null,而是插入一个字符串:'null'
  • 谢谢,我修正了最后一种情况(在与实际 null 仔细检查后)。

标签: cassandra cassandra-3.0


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    • 2018-06-10
    • 1970-01-01
    • 2019-03-11
    • 1970-01-01
    相关资源
    最近更新 更多