【问题标题】:what is the reason for composite column, there must be at least one column which is not part of the primary key复合列的原因是什么,必须至少有一列不是主键的一部分
【发布时间】:2012-10-29 20:57:14
【问题描述】:

来自在线文档: 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 的值会正确显示。

【问题讨论】:

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

标签: cassandra cql


【解决方案1】:

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

【讨论】:

  • 好吧,在 RDBMS 世界中,您可以插入只有键列的行。在我的情况下,我需要的东西都可以放在复合列中,所以我必须添加一个虚拟列?
【解决方案2】:

这个限制在 Cassandra 1.2 中得到修复,现在处于测试阶段。

【讨论】:

  • 你指的是哪一部分?添加仅包含主键列的行?或者使用 CLI 查看使用 CQL3 创建的表?或两者都有:)?
猜你喜欢
  • 1970-01-01
  • 2019-06-02
  • 2015-10-18
  • 1970-01-01
  • 1970-01-01
  • 2012-05-31
  • 1970-01-01
  • 1970-01-01
  • 2017-09-16
相关资源
最近更新 更多