在Cassandra中UPDATE和INSERT的区别?

对Cassandra执行CQL时, UPDATEINSERT什么区别?

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

有没有一个“首选”的方法来使用? 还是有一种情况下应该使用另一种?

非常感谢!

Cassandra中的计数器列不能设置为任意值:它们只能以任意值递增或递减。

因为这个原因, INSERT不支持Counter Column,因为你不能将一个值“插入”到Counter列中。 你只能通过一些值来UPDATE它们(增加或减less)。 这是你如何更新一个计数器列。

  UPDATE ... SET name1 = name1 + <value> 

你问:

有没有一个“首选”的方法来使用? 还是有一种情况下,应该使用另一种?

是。 如果要将值插入数据库,则可以使用INSERT 。 如果该列不存在,则会为您创build。 否则, INSERT的效果与UPDATE类似。 如果没有预先devise的模式(dynamic列族,即随时插入任何东西),则INSERT非常有用。 如果您正在devise模式(Static Column Family,类似于RDMS)并知道每一列,那么您可以使用UPDATE

有一个微妙的区别。 如果将所有非关键字字段设置为空,则通过INSERT插入logging将保留。 如果将所有非关键字字段设置为空,则通过UPDATE插入的logging将消失。

尝试这个:

 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; 

返回:

  pk | f1 ----+---- 1 | 1 2 | 2 

现在,将每行设置f1更新为空。

 UPDATE T SET f1 = null WHERE pk = 1; UPDATE T SET f1 = null WHERE pk = 2; SELECT * FROM T; 

请注意,行1保留,而行2被删除。

  pk | f1 ----+------ 1 | null 

如果你使用Cassandra-cli来看这些,你会看到添加行的方式不同。

我确定想知道这是否是由devise或错误,并看到这种行为logging。

关于billbaird突出显示的微妙差异(我无法直接对该post发表评论),如果所有非关键字字段为空,那么由更新操作创build的行将被删除:

这是预期的行为,而不是基于https://issues.apache.org/jira/browse/CASSANDRA-11805 (这是closures的“不是一个问题”)的错误报告的错误

我第一次使用Spring Data的时候遇到了这个问题。 我正在使用存储库的save(T entity)方法,但没有创build行。 原来Spring Data使用了一个UPDATE因为它确定了这个对象不是'new'(不确定'isNew'的testing在这里是否有意义),而且我碰巧正在testing只有关键字段被设置的实体。

对于这个Spring数据的情况,Cassandra特定的存储库接口确实提供了一个insert方法,如果需要这种行为,虽然Spring的文档没有足够的文档描述这些细节,但看起来总是使用INSERT

另一个微妙的区别(我开始相信cql是cassandra的一个糟糕的接口,由于使用了相似的SQL语法,但语义略有不同,所以它们充满了细节和警告)是在现有数据上设置TTL。 使用UPDATE ,即使新的实际值等于旧的值,也不能更新键的TTL。 解决的办法是插入新的行,而新的TTL已经设置