2016-03-21 70 views
2

說我有以下架構卡桑德拉表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. 任何建議,可以幫助。

我使用的數據斯塔克斯社區卡桑德拉2.1.8,但我也想知道是否使用索引列刪除由數據斯塔克斯社區卡桑德拉3.2.1

感謝

+0

你是否經常只用PRIMARY KEY查詢?如果這些索引對您來說非常重要,爲什麼不創建將這些索引列用作PRIMARY KEY組件的查詢表? – Aaron

回答

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指標沒有那麼鍵?你如何查詢這些二級索引?

+0

加我1。我喜歡你對#4的回答......不能強調這一點。太多人把Cassandra當作關係數據庫來對待,然後想知道爲什麼它不像他們認爲的那樣工作。 – Aaron

+0

@bechbd:即使我將「sid」字段保留爲聚類列。並從xyz中sid = 101開始查詢DELETE。它會以這個錯誤結束:「一些分區關鍵部分丟失:xyzid」。一個Sid會在表格中定義一組特定的數據。我基本上想要啓動一個查詢,刪除where子句中提到的sid的所有數據。如果我必須指定「xyzid」和「sid」來刪除屬於「sid」的特定數據集,我該怎麼做?對我來說xyzid不過是讓每一行都是獨一無二的。你會建議什麼? –

+0

在CQL中,您始終必須在where子句中包含整個PARTITION KEY,包括在刪除時。因此,從你在這裏陳述'One Sid將在表中定義一組特定的數據'這將導致我說,你應該使用'sid'字段作爲表中的分區鍵而不是xyzid。 – bechbd

1

我想你可以進行刪除兩個步驟:通過二級指數從查詢結果

  • 履行主索引值刪除

    1. 選擇數據,並得到主索引列的值 (xyzid)。