我知道我不能在计数器表中插入,但如果表为空则如何使用更新,更新语句需要k_where
我尝试了很多更新声明但是没有希望,如果有任何修复此示例的例子将受到高度赞赏
答案 0 :(得分:1)
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
考虑到除了主键列之外,您可能只在表中使用计数器定义了计数器列。此外,您始终更新数据,只需插入分区键。
如果你想把计数器放回零,你必须读取它的当前值,然后你必须设置为v = v - read_value。请注意,可能还有其他并发更新。
即使客户收到更新失败的消息,计数器有时也可能会更新,因此它们不是100%可靠。
收到评论后:)看起来你遇到了某种Cassandra命名错误。这是我对你的问题的探索:
我从你原来的问题开始:
Update "QueueMetric"
Set "TotalCompletedMessages" = TotalCompletedMesseages + 1
where "QueueName" = 'Test Queue one'
and "Time" = now();
所以我创建了一个简单的表:
create table QueueMetric(
QueueName text primary key,
Time timeuuid,
TotalCompletedMessages counter
)
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();
我在这里得到了同样的例外......我也尝试使用预定义的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';
我也失败了......
所以现在我的想法是,时间在某种程度上是错误的名称
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';
这也行不通......让我们尝试使用分区键:
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();
现在真的很奇怪......我会尝试不同的名字;
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();
好吧可能是时候了:
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';
看起来好像必须有主键和列?
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';
现在我真的很困惑,小写一切?
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';
这也不起作用:)
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';
现在这完全有效:)它看起来你实际上有一些奇怪的名字 让我们尝试一下你在开头时使用的不同名称:
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();
我想我们应该把它归档为某种bug ......它看起来像你的 问题只是命名:)看起来像Queue是cql中的特殊内容
:)