复合列的原因是什么,必须至少有一列不属于主键

时间:2012-10-29 20:57:15

标签: cassandra cql

来自在线文件: CQL 3表的主键可以包含任意数量(1个或更多)的组件列,但必须至少有一列不属于主键。

这是什么原因?

我尝试仅在CQL中的复合键中插入一行。当我做SELECT

时,我看不到它
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时,它显示出一些东西:

default@demo] 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的结果:

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

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

2 个答案:

答案 0 :(得分:0)

真正发生的事情是,使用构成行键名和列名的主键值保存非键值。如果您没有插入任何非键值,那么您实际上并未创建任何新的列族列。行键来自第一个主键,因此Cassandra能够为您创建新行,即使没有使用它创建列。

答案 1 :(得分:0)

此限制已在Cassandra 1.2中修复,现在处于测试阶段。