什么时候在cassandra中覆盖行

When are rows overwritten in cassandra

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

例如:

我有列 (user_id int, item_id int, site_id int),我的 PRIMARY KEY(user_id, item_id)

如果我有以下 table:

user_id, item_id, site_id
   2       3        4

然后我插入 user_id : 2, item_id : 3, site_id : 10,我的新 table 将是:

user_id, item_id, site_id
   2       3        10

没有

user_id, item_id, site_id
   2       3        4
   2       3        10

这个简单的案例在所有情况下都成立吗?是否有任何我可能没有意识到的微妙之处?另外,我在文档中找不到这个,通过玩 cassandra 得出这个结论,谁能提供文档源?

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

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

来自 UPDATE 文档:

The row is created if none existed before, and updated otherwise. Specify the row to update in the WHERE clause by including all columns composing the partition key. ... The UPDATE SET operation is not valid on a primary key field.

来自 INSERT 文档:

You do not have to define all columns, except those that make up the key. ... If the column exists, it is updated. The row is created if none exists.

虽然这些摘录可能不会马上说出来 "be careful not to overwrite",但我确实设法在 Planet Cassandra 上找到了一篇更明确的文章:How to Do an Upsert in Cassandra

Cassandra is a distributed database that avoids reading before a write, so an INSERT or UPDATE sets the column values you specify regardless of whether the row already exists. This means inserts can update existing rows, and updates can create new rows. It also means it’s easy to accidentally overwrite existing data, so keep that in mind.