Cassandra不支持索引列上的DELETE

时间:2016-03-21 08:03:29

标签: cassandra datastax cqlsh cassandra-3.0

假设我有一个带有以下架构的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"
  1. 是否必须在删除查询的where子句中指定主键?

  2. Cassandra是否支持使用二级索引删除?

  3. 使用二级索引删除数据需要做些什么?

  4. 任何有用的建议。

  5. 我正在使用Data Stax社区Cassandra 2.1.8,但我也想知道Data Stax社区Cassandra 3.2.1是否支持使用索引列进行删除

    由于

2 个答案:

答案 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)

我想您可以分两步执行删除:

  1. 按二级索引选择数据并获取主索引列值 (xyzid)来自查询结果
  2. 按主索引值执行删除。