Cassandra不支持在索引列上进行删除操作。

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是否支持使用二级索引进行删除操作?

  3. 如何使用二级索引删除数据?

  4. 有什么建议可以帮助吗?

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

谢谢!


你有多少次只是通过主键来查询数据?如果这些索引对于你如此重要,为什么不创建一个查询表,使用这些索引列作为主键组件呢? - Aaron
2个回答

3

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

1) 是的,如果您要在CQL语句中使用where子句,则PARTITION KEY必须是where子句中的等号运算符。除此之外,您只能过滤主键中指定的聚簇列。(除非您有一个二级索引)

2) 不,它不会。请参阅此帖子以获取更多信息,因为它本质上是相同的问题。 为什么Cassandra可以使用辅助键“select”,但不能使用辅助键“update”?(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索引会稍微好一些),所以我的问题是:您是否可以将这些字段作为聚簇列添加到主键中?您如何查询这些辅助索引?


我给你点个赞。我喜欢你对第四个问题的回答...无法强调它的重要性。太多人把Cassandra当作关系型数据库来处理,然后想知道为什么它不像他们想象的那样工作。 - Aaron
@bechbd:即使我将“sid”字段保留为聚簇列,并发出查询DELETE from xyz where sid = 101,也会出现此错误:“缺少某些分区键部分:xyzid”。一个Sid将在表中定义一组特定的数据。我基本上想发出一个查询,它将删除所有具有我在where子句中提到的sid的数据。如果我必须指定“xyzid”以及“sid”来删除属于“sid”的特定数据集,我该怎么做?对我来说,xyzid什么都不是,它只是使每行唯一。你有什么建议? - Syed Ammar Mustafa
在CQL中,您始终必须在where子句中包括整个PARTITION KEY,包括删除操作。因此,从您在这里陈述的内容“一个Sid将定义表中的特定数据集”,我得出结论您应该在表中使用sid字段作为PARTITION KEY,而不是xyzid。 - bechbd
但是如果我将sid作为分区键,每一行如何保持唯一性呢?比如说我有10行数据的sid都是100,如果我将sid作为分区键,那么它们不就会被覆盖掉了吗? - Syed Ammar Mustafa
你可以使用类似 PRIMARY KEY (sid, xyzid) 的东西。这将使您能够通过 WHERE sid=A AND xyzid=B 查找单个行进行更新等,并允许您通过 WHERE sid=A 删除整个 sid。 - bechbd

2

我想你可以通过以下两个步骤来执行删除操作:

  1. 通过二级索引选择数据,并从查询结果中获取主键索引列值(xyzid)
  2. 通过主键索引值执行删除操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接