这种类型的计数器 table 定义有效吗?
Is this type of counter table definition valid?
我想创建一个具有宽分区的 table(或者,换句话说,一个没有值列(非主键列)的 table),以启用行数它的任何分区都可以有效地采购。这是一个简单的定义 table
CREATE TABLE IF NOT EXISTS test_table
(
partitionKeyCol timestamp
clusteringCol timeuuid
partitionRowCountCol counter static
PRIMARY KEY (partitionKeyCol, clusteringCol)
)
这个定义和其他类似结构的问题在于,无法从文档中包含的信息中清楚地推断出它们的有效性。
文档说明了什么(关于计数器):
计数器列既不能指定为 table 的 PRIMARY KEY
的一部分,也不能用于创建 INDEX
计数器列只能在 专用计数器 table 中定义(我认为是 table将计数器列定义为其值列)
文档没有说明的内容(关于计数器):
一个table为其定义静态计数器列的能力(鉴于计数器的唯一写入路径,我觉得这值得一提)
table 的能力,它具有为其定义的零值列(使其成为 专用计数器 table,根据我对该术语的理解),还为其定义了一个静态计数器列
鉴于文档中存在(或不存在)有关此主题的信息,这样的定义似乎是有效的。但是,我不确定这怎么可能,因为更新 partitionRowCountCol
需要使用不同于插入 (partitionKeyCol, clusteringCol)
元组的写入路径。
这种类型的计数器 table 定义有效吗?如果是这样,如何写入 table?
看起来可以定义具有此结构的 table,但我正在努力为它找到一个好的用例。似乎没有办法实际写入该集群列。
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"
您要建模的是什么?
我想创建一个具有宽分区的 table(或者,换句话说,一个没有值列(非主键列)的 table),以启用行数它的任何分区都可以有效地采购。这是一个简单的定义 table
CREATE TABLE IF NOT EXISTS test_table
(
partitionKeyCol timestamp
clusteringCol timeuuid
partitionRowCountCol counter static
PRIMARY KEY (partitionKeyCol, clusteringCol)
)
这个定义和其他类似结构的问题在于,无法从文档中包含的信息中清楚地推断出它们的有效性。
文档说明了什么(关于计数器):
计数器列既不能指定为 table 的
PRIMARY KEY
的一部分,也不能用于创建INDEX
计数器列只能在 专用计数器 table 中定义(我认为是 table将计数器列定义为其值列)
文档没有说明的内容(关于计数器):
一个table为其定义静态计数器列的能力(鉴于计数器的唯一写入路径,我觉得这值得一提)
table 的能力,它具有为其定义的零值列(使其成为 专用计数器 table,根据我对该术语的理解),还为其定义了一个静态计数器列
鉴于文档中存在(或不存在)有关此主题的信息,这样的定义似乎是有效的。但是,我不确定这怎么可能,因为更新 partitionRowCountCol
需要使用不同于插入 (partitionKeyCol, clusteringCol)
元组的写入路径。
这种类型的计数器 table 定义有效吗?如果是这样,如何写入 table?
看起来可以定义具有此结构的 table,但我正在努力为它找到一个好的用例。似乎没有办法实际写入该集群列。
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"
您要建模的是什么?