假设我有一个带有以下架构的cassandra表xyz:
create table xyz(
xyzid uuid,
name text,
fileid int,
sid int,
PRIMARY KEY(xyzid));
我在列fileid,sid:
上创建索引CREATE INDEX file_index ON xyz (fileid);
CREATE INDEX sid_index ON xyz (sid);
我插入数据:
INSERT INTO xyz (xyzid, name , fileid , sid ) VALUES ( now(), 'p120' , 1, 100);
INSERT INTO xyz (xyzid, name , fileid , ssid ) VALUES ( now(), 'p120' , 1, 101);
INSERT INTO xyz (xyzid, name , fileid , sid ) VALUES ( now(), 'p122' , 2, 101);
我想使用索引列删除数据:
DELETE from xyz WHERE fileid=1 and sid=101;
为什么我会收到此错误?
InvalidRequest: code=2200 [Invalid query] message="Non PRIMARY KEY fileid found in where clause"
是否必须在删除查询的where子句中指定主键?
Cassandra是否支持使用二级索引删除?
使用二级索引删除数据需要做些什么?
任何有用的建议。
我正在使用Data Stax社区Cassandra 2.1.8,但我也想知道Data Stax社区Cassandra 3.2.1是否支持使用索引列进行删除
由于
答案 0 :(得分:3)
让我尝试按顺序回答你的问题:
1)是的,如果要在CQL语句中使用where子句,则PARTITION KEY必须是where子句中的相等运算符。除此之外,您只能过滤主键中指定的群集列。 (除非你有二级索引)
2)不,不。有关更多信息,请参阅此帖子,因为它基本上是同一个问题。 Why can cassandra "select" on secondary key, but not update using secondary key? (1.2.8+)
3)为什么不在主键中添加sid
作为群集列。这将允许您使用两者进行删除或查询。
create table xyz(
xyzid uuid,
name text,
fileid int,
sid int,
PRIMARY KEY(xyzid, sid));
4)一般情况下,使用二级索引被认为是一种反模式(在C * 3.4中使用SASI索引的情况稍微不那么)所以我的问题是你可以将这些字段作为聚类列添加到主键吗?你是如何查询这些二级索引的?
答案 1 :(得分:1)
我想您可以分两步执行删除: