如何使用CQL更新Cassandra整数列?
我在卡桑德拉有一个“评论”表,如下所述:如何使用CQL更新Cassandra整数列?,cassandra,cql,Cassandra,Cql,我在卡桑德拉有一个“评论”表,如下所述: CREATE TABLE reviews ( review_id text, downcount int, upcount int, creation_date timestamp, PRIMARY KEY (review_id) ) 假设我想将upcount值增加1,我如何在Cassandra CQL中做到这一点 当我这样做时: UPDATE reviews SET upcount = upcount +1 WHERE revie
CREATE TABLE reviews (
review_id text,
downcount int,
upcount int,
creation_date timestamp,
PRIMARY KEY (review_id)
)
假设我想将upcount
值增加1,我如何在Cassandra CQL中做到这一点
当我这样做时:
UPDATE reviews SET upcount = upcount +1 WHERE review_id = '123456';
它给出了以下错误:
错误请求:对非计数器列upcount
的操作无效(upcount=upcount+1
)
你不能那样做。您必须读取列,在应用程序端更新值,并分配更新后的值。正如错误所示,在cassandra中只有计数器列支持此功能
原因很简单。计数器跨分布式节点同步。由于cassandra确保了最终的一致性,因此对非计数器列的更新可能会在服务器端创建竞争条件。您可以使用cassandra的计数器列数据类型。请记住,如果非计数器列不是复合
主键的一部分,则不能将计数器列与同一列族中的非计数器列混合使用。因此,您必须将计数器分成另一个列族,例如reviews\u counts
CREATE TABLE reviews (
review_id text,
creation_date timestamp,
PRIMARY KEY (review_id)
)
CREATE TABLE reviews_counts (
review_id text,
downcount counter,
upcount counter,
PRIMARY KEY (review_id)
)
现在increment语句应该可以工作了
UPDATE keyspace.reviews_counts
SET upcount = upcount + 1
WHERE review_id = '123456'
下面是有关Cassandra计数器列的更多文档。
有点晚,但我最终得到了一个集合(例如,在您的案例中,向上投票和向下投票实体的ID)。您可以更新类似于计数器的集合
,但不需要将其放在单独的表中。我的柜台基本上和这一套一样长。若您并没有UUID,那个么即使是添加和删除元素的列表也可以工作。
当然,这不是一个通用的解决方案,尤其是对于低于计数器的高数字,但在其他一些情况下可能会有所帮助。我知道计数器,只是想避免这种情况,看看是否有其他选择。无论如何,我会去用它。谢谢你的回答。还有一个关于卡桑德拉的天真问题,是否可以在列族中不存在列的情况下定义主键,就像您在review\u counts表中将主键定义为review\u id一样。我不这样认为。与SQL类似,如果外键实际位于表abc
中,则无法引用表abc
中的外键。此外,Cassandra基于主键在集群中组织/复制数据,因此我假设它必须位于列族中。因此review\u id应该位于reviews\u counts表中。谢谢。回答不错,您可能希望将SET counter=upcount+1更改为SET upcount=upcount+1。是的,我希望避免在应用程序端更新该值,因为这将是对数据库的额外查询。无论如何,感谢您提供有关一致性的有用信息。@tushR,实际上,在Cassandra中,UPDATE
总是为正在更新的行创建一个新实例,因此实际上,总是先读取现有行。。。您只能避免在cassandra节点和客户端之间传输数据。