我不确定您是否可以更改表中特定行的分区键值。例如,如果您有一个表,其中PRIMARY KEY(name,title)和一些条目,其中name=“John”,title=“New”。我们能否运行:
UPDATE table SET name="Ron" WHERE name="John" AND title="New";
我理解分区键的一般概念,这样它可以唯一地标识分区中的行,同时还可以标识包含所述分区的节点。所以这让我相信这不会发生。
oipij1gg1#
所以这让我相信这不会发生。你说得对。对于Cassandra,可以正确地说UPDATE和INSERT通常做相同的事情(在引擎盖下)。然而,在这种情况下,情况并非如此。运行UPDATE语句将生成以下消息:
UPDATE
INSERT
> UPDATE table SET name='Ron' WHERE name='John' AND title='New'; InvalidRequest: Error from server: code=2200 [Invalid query] message="PRIMARY KEY part name found in SET part"
这是因为UPDATE对WHERE子句有额外的检查。处理这种情况的最佳方法是使用新键重写行,然后DELETE重写旧行。最好将这两个语句 Package 在BATCH中,以确保条目不会因为其中一个失败而以奇怪的状态结束。
WHERE
DELETE
BATCH
BEGIN BATCH INSERT INTO table (name,title) VALUES ('Ron','New'); DELETE FROM table WHERE name='John' AND title='New'; APPLY BATCH;
ymdaylpp2#
无法更改Cassandra中某行的分区键。分区键唯一标识表中的分区。将分区键视为记录ID。不可能更改分区的分区键,因为它更像标识实际数据在集群中存储位置的元数据。一个简单的类比就是你家的地址。您的地址(分区键)是定位您的房子(分区或数据)的唯一标识符。如果你改变了地址,那么它将识别出一个完全不同的房子,而不是你的房子。除非你已经搬家,否则把地址改成你家是没有意义的。如果试图运行发布的示例查询,则会收到一个错误,指示SET子句中包含一个无效的主键列。干杯
SET
2条答案
按热度按时间oipij1gg1#
所以这让我相信这不会发生。
你说得对。对于Cassandra,可以正确地说
UPDATE
和INSERT
通常做相同的事情(在引擎盖下)。然而,在这种情况下,情况并非如此。运行UPDATE
语句将生成以下消息:这是因为
UPDATE
对WHERE
子句有额外的检查。处理这种情况的最佳方法是使用新键重写行,然后DELETE
重写旧行。最好将这两个语句 Package 在
BATCH
中,以确保条目不会因为其中一个失败而以奇怪的状态结束。ymdaylpp2#
无法更改Cassandra中某行的分区键。
分区键唯一标识表中的分区。将分区键视为记录ID。不可能更改分区的分区键,因为它更像标识实际数据在集群中存储位置的元数据。
一个简单的类比就是你家的地址。您的地址(分区键)是定位您的房子(分区或数据)的唯一标识符。如果你改变了地址,那么它将识别出一个完全不同的房子,而不是你的房子。除非你已经搬家,否则把地址改成你家是没有意义的。
如果试图运行发布的示例查询,则会收到一个错误,指示
SET
子句中包含一个无效的主键列。干杯