这种类型的计数器表定义是否有效?

时间:2016-03-23 14:43:35

标签: cassandra cql cql3

我想创建一个包含宽分区的表(或者换句话说,一个没有值列的表(非主键列)),这样可以有效地获取任何分区中的行数。这是这种表的简单定义

CREATE TABLE IF NOT EXISTS test_table
(
    partitionKeyCol         timestamp
    clusteringCol           timeuuid
    partitionRowCountCol    counter    static
    PRIMARY KEY             (partitionKeyCol, clusteringCol)
)

此定义的问题以及其他类似结构的问题在于,无法从文档中包含的信息中明确推断出它们的有效性。

文档的内容(关于计数器):

  • 计数器列既不能指定为表PRIMARY KEY的一部分,也不能用于创建INDEX

  • 计数器列只能在专用计数器表中定义(我将其作为仅将计数器列定义为其值列的表)

文档未说明的内容(关于计数器):

  • 表为其定义静态计数器列的能力(给定计数器的唯一写入路径,我觉得这值得一提)

  • 表格的能力,为其定义零值列(使其成为专用计数器表,根据我对该术语的理解),还具有静态计数器列为它定义

鉴于有关该主题的信息存在于(并且不存在)文档中,这样的定义似乎是有效的。但是,我不确定这是怎么可能的,因为对partitionRowCountCol的更新需要使用与用于插入(partitionKeyCol, clusteringCol)元组的写路径不同的写路径。

这种类型的计数器表定义是否有效?如果是这样,如何对表进行写入?

1 个答案:

答案 0 :(得分:1)

看起来可以定义具有此结构的表,但我正在努力为它找到一个好的用例。似乎没有办法真正写入该聚类列。

CREATE TABLE test.test_table (
    a timestamp,
    b timeuuid,
    c counter static,
    PRIMARY KEY (a, b)
);

cassandra@cqlsh:test> insert into test_table (a,b,c) VALUES (unixtimestampof(now()), now(), 3);
InvalidRequest: code=2200 [Invalid query] message="INSERT statements are not allowed on counter tables, use UPDATE instead"
cassandra@cqlsh:test> update test_table set c = c + 1 where a=unixtimestampof(now());
cassandra@cqlsh:test> update test_table set c = c + 1 where a=unixtimestampof(now());
cassandra@cqlsh:test> select * from test_table;

 a                        | b    | c
--------------------------+------+---
 2016-03-24 15:04:31+0000 | null | 1
 2016-03-24 15:04:37+0000 | null | 1

(2 rows)
cassandra@cqlsh:test> update test_table set c = c + 1 where a=unixtimestampof(now()) and b=now();
InvalidRequest: code=2200 [Invalid query] message="Invalid restrictions on clustering columns since the UPDATE statement modifies only static columns"
cassandra@cqlsh:test> insert into test_table (a,b) VALUES (unixtimestampof(now()), now());
InvalidRequest: code=2200 [Invalid query] message="INSERT statements are not allowed on counter tables, use UPDATE instead"
cassandra@cqlsh:test> update test_table set b = now(), c = c + 1 where a=unixtimestampof(now());
InvalidRequest: code=2200 [Invalid query] message="PRIMARY KEY part b found in SET part"

你想要建模的是什么?