2013-08-28 25 views
0

我是Cassandra的新手,並且遵循this在youtube上的Cassandra教程。在本教程中,作者正在創建兩個表格,如下所示:Cassandra 1.2中使用CQL的主鍵定義3

create table children(childid varchar, firstname varchar, lastname varchar, country varchar, state varchar, zip varchar, primary key(child)) with compact storage; 

create table naughtyornicelist(standingbycountry varchar, state varchar, zip varchar, childid varchar, primary key(standingbycountry, state, zip, childid)); 

我現在面臨兩個問題。

第一個問題是children表只有當我刪除with compact storage時才被創建。

第二個問題是在創建naughtyornicelist表,卡珊德拉拋出以下錯誤:Bad Request: No definition found that is not part of the PRIMARY KEY

我給下面的命令

cqlsh:northpole> create table naughtyornicelist(standingbycountry varchar, state varchar, zip varchar, childid varchar, primary key(standingbycountry, state, zip, childid)); 
Bad Request: No definition found that is not part of the PRIMARY KEY 
cqlsh:northpole> 

我無法找到爲什麼這個錯誤即將到來,如何解決這個錯誤。要求卡桑德拉人請求幫助。

回答

2

孩子應該創建過程中發生故障不管緊湊的存儲與否,你的主鍵是沒有定義:

create table northpole.children(
    childid varchar,   <---- column name = childid 
    firstname varchar, 
    lastname varchar, 
    country varchar, 
    state varchar, 
    zip varchar, 
    primary key(child)  <---- column name = child != childid 
) with compact storage; 

沒有定義,發現不是PRIMARY KEY

的一部分

您正在創建使用主鍵中的每列(cql talk)的列族(cql table)。你不能這樣做。如果你希望能夠在WHERE子句中使用的列考慮secondary indexed

create table northpole.naughtyornicelist (
    standingbycountry varchar, 
    state varchar, 
    zip varchar, 
    childid varchar, 
    PRIMARY KEY(childid, standingbycountry) 
); 

CREATE INDEX inex_name ON northpole.naughtyornicelist (zip); 
CREATE INDEX inex_name ON northpole.naughtyornicelist (state); 

你有作爲主鍵是什麼,因爲它決定了數據的分發和集羣是非常重要的。密鑰的第一部分(在本例中爲childid)稱爲分區密鑰,用於在不同節點之間分發數據,因此您希望分區密鑰儘可能隨機。剩下的字段組成密鑰集用於排序,以便查詢具有相同集羣密鑰的列可以更高效。 注意這是一個粗略的指南,我不知道你將如何查詢,但你將不得不相應地調整你的模式。