Cassandra中UPDATE和INSERT之间的区别?

Chr*_*row 43 cql cassandra cql3

是什么区别UPDATEINSERT对Cassandra的执行CQL什么时候?

它看起来似乎没有区别,但现在文档说它INSERT不支持计数器UPDATE.

是否有"首选"方法?或者是否有人应该使用另一个?

非常感谢!

小智 48

有一个微妙的区别.如果将所有非键字段设置为null,则会保留通过INSERT插入的记录.如果将所有非键字段设置为null,则通过UPDATE插入的记录将消失.

试试这个:

CREATE TABLE T (
  pk int,
  f1 int,
  PRIMARY KEY (pk)
);

INSERT INTO T (pk, f1) VALUES (1, 1);
UPDATE T SET f1=2 where pk=2;
SELECT * FROM T;
Run Code Online (Sandbox Code Playgroud)

返回:

 pk | f1
----+----
  1 |  1
  2 |  2
Run Code Online (Sandbox Code Playgroud)

现在,将每行设置f1更新为null.

UPDATE T SET f1 = null WHERE pk = 1;
UPDATE T SET f1 = null WHERE pk = 2;
SELECT * FROM T;
Run Code Online (Sandbox Code Playgroud)

请注意,第1行仍然存在,而第2行则被删除.

 pk | f1
----+------
  1 | null
Run Code Online (Sandbox Code Playgroud)

如果您使用Cassandra-cli查看这些内容,您将看到添加行的方式不同.

我肯定想知道这是设计还是错误,并记录下这种行为.

  • 接得好!你有更多的洞察力吗? (4认同)

gob*_*ice 19

Cassandra中的计数器列无法设置为任意值:它们只能递增或递减任意值.

因此,INSERT不支持计数器列,因为您无法将值"插入"计数器列.你只能UPDATE通过一些值来增加或减少它们.以下是更新Counter列的方法.

    UPDATE ... SET name1 = name1 + <value> 
Run Code Online (Sandbox Code Playgroud)

您询问:

是否有"首选"方法?或者是否有人应该使用另一个?

是.如果要将值插入数据库,则可以使用INSERT.如果列不存在,将为您创建.否则,INSERT效果类似于UPDATE.INSERT当您没有预先设计的架构(动态列族,即随时插入任何内容)时,此选项非常有用.如果您事先设计架构(静态列族,类似于RDMS)并且知道每列,那么您可以使用UPDATE.