cassandra 如何在没有分区键的情况下更新行?

dkqlctbz  于 2023-02-15  发布在  Cassandra
关注(0)|答案(2)|浏览(217)

在有4个节点的Cassandra DB上,我想执行一个如下所示的update语句。

UPDATE table_todo SET todoUserKey = '123' WHERE todoUserKey = "000";

我得到一个异常

InvalidRequest: Error from server: code=2200 [Ivalid query] message="Some partition key parts are missing: id"

据我所知,由于Cassandra运行在多个节点上,我需要准确地指定需要在哪个节点上执行Update操作。
但是我没有关于ID的任何信息。我如何执行更新语句?

0vvn1miw

0vvn1miw1#

您必须标识行。Cassandra要求所有写操作提供确切的主键。从UPDATE命令的CQL文档中:
WHERE子句用于选择要更新的行,并且必须包括PRIMARY KEY的所有列

wbrvyc0a

wbrvyc0a2#

不可能执行您的查询,因为如果允许执行,则意味着Cassandra必须执行全表扫描,以检查集群中每个节点上每个分区上的每一行。
允许这样的更新操作并不能扩展,如果你有一个包含数十亿个分区的表,每个分区包含数百或数千行,而集群又包含数百个节点,那么不难看出,允许查询运行的代价是非常昂贵的,而且执行效果也不好。
正是由于这个原因,您不仅需要指定分区键,还需要指定集群列(在适当的地方),这样Cassandra就可以更新分区中的特定行,而不必执行全表扫描。

相关问题