2012-10-29 27 views
1

从联机文档: CQL 3表的主键可以具有任意数量(1个或多个)组件列,但必须至少有一列不是主键的一部分。组合列的原因是什么,必须至少有一列不是主键的一部分

这是什么原因?

我试着只在CQL中的组合键中插入一行。我不能看到它时,我做的选择

cqlsh:demo> CREATE TABLE DEMO ( 
user_id bigint, 
    dep_id bigint, 
    created timestamp, 
    lastupdated timestamp, 
    PRIMARY KEY (user_id, dep_id) 
    ); 

cqlsh:demo> INSERT INTO DEMO (user_id, dep_id) 
    ... VALUES (100, 1); 

cqlsh:demo> select * from demo; 


cqlsh:demo> 

但是当我使用CLI,它显示了一句:

[email protected]] list demo; 
Using default limit of 100 
Using default column limit of 100 
------------------- 
RowKey: 100 

1 Row Returned. 
Elapsed time: 27 msec(s). 

但无法看到列的值。

后,我补充这是不是在主键列,该值显示出来的CQL

cqlsh:demo> INSERT INTO DEMO (user_id, dep_id, created) 
     ... VALUES (100, 1, '7943-07-23'); 
    cqlsh:demo> select * from demo; 
    user_id | dep_id | created     | lastupdated 
    ---------+--------+--------------------------+------------- 
    100 |  1 | 7943-07-23 00:00:00+0000 |  null 

结果从CLI:

[[email protected]] list demo; 
Using default limit of 100 
Using default column limit of 100 
    ------------------- 
RowKey: 100 
invalid UTF8 bytes 0000ab7240ab7580 
[[email protected]] 

任何想法?
更新:我发现CLI返回无效UTF8字节0000ab7240ab7580的原因,它与为CQL3创建的表不兼容,如果我使用紧凑存储选项,则CLI显示的值正确。

+0

挖了多一点后,行确实加了,但是如果我使用SELECT * FROM tableName,它不会返回,除非我添加了不属于主键的列。 –

回答

0

真正发生的事情是,使用构成行键和列名的主键值来保存非键值。如果你不插入任何非键值,那么你并没有真正创建任何新的列族列。行键来自第一个主键,所以这就是为什么Cassandra能够为你创建一个新行,尽管没有创建任何列。

+0

好吧,在RDBMS世界中,您可以只用关键列插入行。在我的情况下,我需要的东西都可以放在复合列中,所以我将不得不添加一个虚拟列? –

0

此限制在Cassandra 1.2中得到修复,该版本现在处于测试阶段。

+0

你指的是哪一部分?添加只有主键列的行?或者使用CLI查看使用CQL3创建的表?或两者:)? –

相关问题