3

假设我有一个具有以下架构的 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 是否支持使用二级索引 s 进行删除?

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

  4. 任何可以帮助的建议。

我正在使用 Data Stax Community Cassandra 2.1.8,但我也想知道 Data Stax Community Cassandra 3.2.1 是否支持使用索引列删除

谢谢

4

2 回答 2

3

让我尝试按顺序回答您的问题:

1) 是的,如果您要在 CQL 语句中使用 where 子句,那么 PARTITION KEY 必须是 where 子句中的相等运算符。除此之外,您只能过滤主键中指定的集群列。(除非你有二级索引)

2)不,它没有。有关更多信息,请参阅这篇文章,因为它本质上是相同的问题。 为什么 cassandra 可以在辅助键上“选择”,但不能使用辅助键更新?(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 索引时稍微少一点)所以我的问题是你可以将这些字段作为集群列添加到你的主键中吗?您如何查询这些二级索引?

于 2016-03-21T12:37:17.970 回答
2

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

  1. 按二级索引选择数据并从查询结果中获取主索引列值(xyzid)
  2. 按主索引值执行删除。
于 2016-03-22T19:04:38.047 回答