我知道我不能在计数器表中插入,但是如果表为空如何使用更新,更新语句需要k_where
我尝试了很多更新语句,但不希望任何解决此问题的示例将受到高度赞赏
create table test_counter(a text primary key, v counter);
update test_counter set v = v + 1 where a = 'dummy';
select * from test_counter;
dummy | v
-------------------+---
some_counter_name | 1
Run Code Online (Sandbox Code Playgroud)
请考虑到,除了主键列之外,您在表中可能只有使用计数器定义的计数器列。而且您总是更新数据,分区键只是简单地更新插入。
如果你想将计数器归零,你必须读取它的当前值,然后你必须设置为 v = v - read_value。请注意,可能会有其他并发更新。
即使客户端收到更新失败的消息,计数器有时也可能会更新,因此它们不是 100% 可靠。
收到评论后:)看起来您遇到了某种 Cassandra 命名错误。这是我对你的问题的探索:
我从你原来的问题开始:
Update "QueueMetric"
Set "TotalCompletedMessages" = TotalCompletedMesseages + 1
where "QueueName" = 'Test Queue one'
and "Time" = now();
Run Code Online (Sandbox Code Playgroud)
所以我创建了一个简单的表:
create table QueueMetric(
QueueName text primary key,
Time timeuuid,
TotalCompletedMessages counter
)
Run Code Online (Sandbox Code Playgroud)
InvalidRequest: code=2200 [无效查询] message="不能在同一个表中混合计数器和非计数器列"
然后我想你的创建语句是这样的:
create table QueueMetric(
QueueName text,
Time timeuuid,
TotalCompletedMessages counter,
primary key (QueueName, Time)
)
Update QueueMetric Set TotalCompletedMessages = TotalCompletedMesseages + 1 where QueueName='Test Queue one' and Time = now();
Run Code Online (Sandbox Code Playgroud)
我在这里遇到同样的异常...我也尝试使用预定义的 uuid 而不是现在
您的示例也没有意义,因为为什么您要按 timeuuid 聚集计数器?
问题是它是一次性的,即使每秒 10000 个请求,你也必须生成它们 100 年才能发生碰撞。我认为你真正需要的是一个时间戳。
然后我尝试将时间列定义为字符串:
create table QueueMetric(
QueueName text,
Time text,
TotalCompletedMessages counter,
primary key (QueueName, Time)
)
Update QueueMetric Set TotalCompletedMessages = TotalCompletedMesseages + 1 where QueueName='Test Queue one' and Time = 'd14d44b2-e4d1-11e6-bf01-fe55135034f3';
Run Code Online (Sandbox Code Playgroud)
这个我也失败了...
所以现在我的想法是时间在某种程度上是错误的名字
create table QueueMetric(
QueueName text,
Test text,
TotalCompletedMessages counter,
primary key (QueueName, Test)
);
Update QueueMetric Set TotalCompletedMessages = TotalCompletedMesseages + 1 where QueueName='Test Queue one' and Test = 'd14d44b2-e4d1-11e6-bf01-fe55135034f3';
Run Code Online (Sandbox Code Playgroud)
这也不起作用......让我们尝试仅使用分区键:
create table QueueMetric(
QueueName text,
Time timeuuid,
TotalCompletedMessages counter,
primary key ((QueueName, Time))
);
Update QueueMetric Set TotalCompletedMessages = TotalCompletedMesseages + 1 where QueueName='Test Queue one' and Time = now();
Run Code Online (Sandbox Code Playgroud)
现在真的变得很奇怪......我会尝试使用不同的名称;
create table QueueMetric2(
QueueName text,
Time timeuuid,
TotalCompletedMessages counter,
primary key ((QueueName, Time))
);
Update QueueMetric2 Set TotalCompletedMessages = TotalCompletedMesseages + 1 where QueueName='Test Queue one' and Time = now();
Run Code Online (Sandbox Code Playgroud)
好吧,可能是时候了:
create table QueueMetric3(
QueueName text,
SomethingOther text,
TotalCompletedMessages counter,
primary key ((QueueName, SomethingOther))
);
Update QueueMetric3 Set TotalCompletedMessages = TotalCompletedMesseages + 1 where QueueName='Test Queue one' and SomethingOther = 'd14d44b2-e4d1-11e6-bf01-fe55135034f3';
Run Code Online (Sandbox Code Playgroud)
看起来好像必须有主键和列?
create table QueueMetric4(
QueueNamePlusTimeUUID text,
TotalCompletedMessages counter,
primary key (QueueNamePlusTimeUUID)
);
Update QueueMetric4 Set TotalCompletedMessages = TotalCompletedMesseages + 1 where QueueName='Test Queue one d14d44b2-e4d1-11e6-bf01-fe55135034f3';
Run Code Online (Sandbox Code Playgroud)
现在我真的很困惑,所有东西都小写吗?
create table queuemetric5(
queuenameplustimeUUID text primary key,
totalcompletedmessages counter
);
update queuemetric5 set totalcompletedmessages = totalcompletedmessages + 1 where queuename='Test Queue one d14d44b2-e4d1-11e6-bf01-fe55135034f3';
Run Code Online (Sandbox Code Playgroud)
这也行不通:)
create table abc(
a text primary key,
t counter
);
update abc set t = t + 1 where a='Test Queue one d14d44b2-e4d1-11e6-bf01-fe55135034f3';
Run Code Online (Sandbox Code Playgroud)
现在这完全可以工作了:)在我看来,你有一些奇怪的名字,实际上让我们尝试一下你一开始的同样的事情,但名字不同:
create table hohoho(
n text,
o timeuuid,
m counter,
primary key (n, o)
);
update hohoho set m = m + 1 where n='Test Queue one' and o = now();
Run Code Online (Sandbox Code Playgroud)
我想我们应该将其作为某种错误归档...在我看来,您的问题只是命名:) 看起来队列在 cql 中是特殊的东西
:)
| 归档时间: |
|
| 查看次数: |
1409 次 |
| 最近记录: |