【问题标题】:When are rows overwritten in cassandra什么时候在 cassandra 中覆盖行
【发布时间】:2026-02-08 17:05:01
【问题描述】:

我的理解是,当插入具有相同主键的另一行时,行会被覆盖。

例如:

我有专栏(user_id int, item_id int, site_id int),还有我的PRIMARY KEY(user_id, item_id)

如果我有下表:

user_id, item_id, site_id
   2       3        4

我插入user_id : 2, item_id : 3, site_id : 10,我的新表将是:

user_id, item_id, site_id
   2       3        10

不是

user_id, item_id, site_id
   2       3        4
   2       3        10

这种简单的情况是否适用于所有情况?有什么我可能不知道的细微之处吗?另外,我在文档中找不到这个,通过玩 cassandra 得出了这个结论,有人可以提供文档源吗?

【问题讨论】:

标签: cassandra insert cql


【解决方案1】:

是的,Cassandra 就是这样设计的。在执行UPDATEINSERT 的所有情况下,如果数据存在,数据将被更新(基于键),并且插入它不存在。需要记住的重要一点是,在底层,UPDATEINSERT 是同义词。如果您认为这两者是相同的,那么您就可以开始理解为什么它会以这种方式工作。

话虽如此,您是对的,因为您必须仔细查看才能在文档中找到对此行为的明确引用。我在文档中找到了最接近的参考资料,并在下面列出:

来自UPDATE 文档:

如果之前不存在该行,则创建该行,否则更新该行。通过包含构成分区键的所有列,在 WHERE 子句中指定要更新的行。 ... UPDATE SET 操作在主键字段上无效。

来自INSERT 文档:

您不必定义所有列,组成键的列除外。 ...如果该列存在,则对其进行更新。如果不存在,则创建该行。

虽然这些摘录可能不会直接出现并说“小心不要覆盖”,但我确实设法找到了一篇关于行星 Cassandra 的更明确的文章:How to Do an Upsert in Cassandra

Cassandra 是一个分布式数据库,它避免在写入之前读取,因此无论该行是否已存在,INSERT 或 UPDATE 都会设置您指定的列值。这意味着插入可以更新现有行,而更新可以创建新行。这也意味着很容易意外覆盖现有数据,因此请记住这一点。

【讨论】: