我有以下Cassandra表:
create table start_stop (id text, start text, end text, price double, PRIMARY KEY (id, start));
我做了这样的插入:
insert into start_stop (id, start) values ('123', 'w');
现在我想进行更新:
update start_stop set end = 'z' where id = '123';
我收到一个错误:
InvalidRequest: code=2200 [Invalid query] message="Some clustering keys are missing: start"
除了在进行更新之前执行查询以查找起始值之外,我该如何解决这个问题?
答案 0 :(得分:7)
您的主键不完整,cassandra只能在主键匹配时更新行。
如果你查看你的表结构,(id,start)combined会生成主键,其中id是分区键。
在cassandra中,更新和插入之间没有区别,但在任何一种情况下,您都需要拥有完整的主键,以便cassandra找到特定的行。
您需要使用以下任一方式进行更新。
update start_stop set end = 'z' where id = '123' and start='w';
insert into start_stop (id, start, end) values ('123', 'w', 'z');
答案 1 :(得分:0)
很简单,您也必须提供群集列值。 (您的PK为PRIMARY KEY (id, start)
,表示 id 为分区键,开始为群集列。
分区键和群集列都是主键的一部分,必须是唯一的。因此,如果您在WHERE子句中仅使用 id 进行更新,则它将不明确。
e.g。 PRIMARY KEY (year, month)
,如果您使用UPDATE table SET value="x" WHERE year=2016
进行更新,cassandra将不知道您确实要更新哪一行。
因此,您需要在UPDATE中提供完整的PRIMARY KEY。 :)