如何在不直接知道主键的情况下更新Cassandra列?

时间:2019-01-28 16:18:54

标签: cassandra

给出一个场景,其中您有一个User表,其中id作为主键。 您有一个名为email的列和一个名为name的列。

您要基于UPDATE {p} User.name

我意识到User.email命令要求您输入一个PRIMARY KEY。这是否意味着我不能使用单纯的UPDATE迁移,并且需要先查询CQL主键,然后才能User.id

在这种情况下,我确实知道PRIMARY KEY,因为UPDATEdev的UUID相同,但是感觉很脏。

2 个答案:

答案 0 :(得分:3)

是的,您是对的-您需要知道记录的主键才能对数据进行更新或删除特定记录。这里有几个选项,具体取决于您的数据模型:

  1. 使用有效的令牌范围扫描对表执行完整扫描(有关更多详细信息,请查看this answer
  2. 如果非常需要此操作,则可以使用User.email作为分区键来创建实例化视图,并获取所有您可以更新的消息ID(但是您需要在应用程序中进行此操作)在CQL中不支持嵌套查询)。但也请注意,物化视图是Cassandra中的“实验性”功能,并且可能并非始终有效(在DataStax Enterprise中更稳定)。另外,如果您的某些用户拥有数十万封电子邮件,则可能会创建较大的分区。
  3. 通过使用附加表,使第二项与您的代码相似

答案 1 :(得分:1)

我认为Alex's answer涵盖了您的问题-“我如何在PK列中找到一个值,而不是从非PK列的值开始倒数?”。

但是,我认为值得注意的是,问这个问题表明您应该重新考虑数据模型。在C *数据模型设计中,经验法则是从考虑所需的查询开始,而您错过了UPDATE查询用例。您也许可以在不更改模型的情况下使事情正常运行,但是如果发现您需要进行其他您不准备进行的查询,则会遇到很多索引和/或MV的操作问题。

更一般地,搜索有关Cassandra数据建模的文章和其他资源。听起来您基本上是将C *用于关系用例,所以您需要对此进行研究。