两者有什么区别 UPDATE 以及 INSERT 对Cassandra执行cql的时候?以前看起来没什么区别,但现在文件上说 INSERT 不支持计数器 UPDATE 做。是否有“首选”方法可供使用?或者在某些情况下,一个应该被使用而不是另一个?非常感谢!
UPDATE
INSERT
y1aodyip1#
另一个微妙的区别(我开始相信cql是一个糟糕的cassandra接口,由于使用了相似的sql语法,但语义略有不同,所以充满了微妙和警告)是在现有数据上设置ttl。与 UPDATE 即使新的实际值等于旧值,也不能更新键的ttl。解决方案是插入新行,并且已经设置了新的ttl
xeufq47z2#
cassandra中的计数器列不能设置为任意值:它们只能按任意值递增或递减。因此, INSERT 不支持计数器列,因为无法将值“插入”到计数器列中。你只能 UPDATE 它们(增加或减少)某个值。下面是如何更新计数器列。
UPDATE ... SET name1 = name1 + <value>
你问:是否有“首选”方法可供使用?或者在某些情况下,一个应该被使用而不是另一个?对。如果要向数据库中插入值,可以使用 INSERT . 如果列不存在,将为您创建它。否则, INSERT 的效果与 UPDATE . INSERT 在没有预先设计的模式(动态列族,即随时插入任何内容)时非常有用。如果您在设计模式之前(静态列族,类似于rdms)就知道每一列,那么您可以使用 UPDATE .
wvyml7n53#
关于billbaird强调的细微差别(我无法直接评论这篇文章),如果所有非关键字段都为null,更新操作创建的行将被删除:这是预期的行为,而不是基于https://issues.apache.org/jira/browse/cassandra-11805 (以“不成问题”结束)我第一次使用spring数据时遇到了这个问题。我用的是 save(T entity) 方法,但未创建任何行。原来spring的数据是用 UPDATE 因为它确定对象不是'new'(不确定'isnew'的测试在这里是否有意义),而且我碰巧正在使用只设置了关键字段的实体进行测试。对于这个spring数据案例,cassandra特定的存储库接口确实提供了一个 insert 始终使用 INSERT 如果需要这种行为(尽管spring的文档也没有充分地记录这些细节)。
save(T entity)
insert
x0fgdtte4#
有一个微妙的区别。如果将所有非键字段设置为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;
退货:
pk | f1 ----+---- 1 | 1 2 | 2
现在,将每行设置f1更新为null。
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
如果您使用cassandracli查看这些行,您将看到不同的行添加方式。我当然想知道这是设计还是一个错误,并看到这个行为的文件。
4条答案
按热度按时间y1aodyip1#
另一个微妙的区别(我开始相信cql是一个糟糕的cassandra接口,由于使用了相似的sql语法,但语义略有不同,所以充满了微妙和警告)是在现有数据上设置ttl。与
UPDATE
即使新的实际值等于旧值,也不能更新键的ttl。解决方案是插入新行,并且已经设置了新的ttlxeufq47z2#
cassandra中的计数器列不能设置为任意值:它们只能按任意值递增或递减。
因此,
INSERT
不支持计数器列,因为无法将值“插入”到计数器列中。你只能UPDATE
它们(增加或减少)某个值。下面是如何更新计数器列。你问:
是否有“首选”方法可供使用?或者在某些情况下,一个应该被使用而不是另一个?
对。如果要向数据库中插入值,可以使用
INSERT
. 如果列不存在,将为您创建它。否则,INSERT
的效果与UPDATE
.INSERT
在没有预先设计的模式(动态列族,即随时插入任何内容)时非常有用。如果您在设计模式之前(静态列族,类似于rdms)就知道每一列,那么您可以使用UPDATE
.wvyml7n53#
关于billbaird强调的细微差别(我无法直接评论这篇文章),如果所有非关键字段都为null,更新操作创建的行将被删除:
这是预期的行为,而不是基于https://issues.apache.org/jira/browse/cassandra-11805 (以“不成问题”结束)
我第一次使用spring数据时遇到了这个问题。我用的是
save(T entity)
方法,但未创建任何行。原来spring的数据是用UPDATE
因为它确定对象不是'new'(不确定'isnew'的测试在这里是否有意义),而且我碰巧正在使用只设置了关键字段的实体进行测试。对于这个spring数据案例,cassandra特定的存储库接口确实提供了一个
insert
始终使用INSERT
如果需要这种行为(尽管spring的文档也没有充分地记录这些细节)。x0fgdtte4#
有一个微妙的区别。如果将所有非键字段设置为null,则通过insert插入的记录将保留。如果将所有非键字段设置为null,则通过update插入的记录将消失。
试试这个:
退货:
现在,将每行设置f1更新为null。
请注意,行1保留,而行2被删除。
如果您使用cassandracli查看这些行,您将看到不同的行添加方式。
我当然想知道这是设计还是一个错误,并看到这个行为的文件。