Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用CQL更新Cassandra整数列?_Cassandra_Cql - Fatal编程技术网

如何使用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节点和客户端之间传输数据。