我想创建一个包含宽分区的表(或者换句话说,一个没有值列的表(非主键列)),这样可以有效地获取任何分区中的行数。这是这种表的简单定义
CREATE TABLE IF NOT EXISTS test_table
(
partitionKeyCol timestamp
clusteringCol timeuuid
partitionRowCountCol counter static
PRIMARY KEY (partitionKeyCol, clusteringCol)
)
此定义的问题以及其他类似结构的问题在于,无法从文档中包含的信息中明确推断出它们的有效性。
文档的内容(关于计数器):
计数器列既不能指定为表PRIMARY KEY
的一部分,也不能用于创建INDEX
计数器列只能在专用计数器表中定义(我将其作为仅将计数器列定义为其值列的表)
文档未说明的内容(关于计数器):
表为其定义静态计数器列的能力(给定计数器的唯一写入路径,我觉得这值得一提)
表格的能力,为其定义零值列(使其成为专用计数器表,根据我对该术语的理解),还具有静态计数器列为它定义
鉴于有关该主题的信息存在于(并且不存在)文档中,这样的定义似乎是有效的。但是,我不确定这是怎么可能的,因为对partitionRowCountCol
的更新需要使用与用于插入(partitionKeyCol, clusteringCol)
元组的写路径不同的写路径。
这种类型的计数器表定义是否有效?如果是这样,如何对表进行写入?
答案 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"
你想要建模的是什么?