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: код = 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 вместо ныне
Ваш пример также не имеет смысла, потому что зачем вам кластеризовать счетчики по тайм-ауту?
Вещь - это одноразовая вещь, даже с 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();
Я думаю, мы должны подать это как какое-то ошибка ... он смотрит на меня вашу проблемы именования только :) Похоже, очередь что-то особенное в CQL
:)
спасибо @Marko теперь я получаю ошибку синтаксиса ошибки только X = X + поддерживает любую идею, что это неправильно –
AMH
просто пришлите мне заявления, я попытайтесь понять это - мне кажется, вы пытаетесь указать значение x = что-то ... вы можете сделать только x = x + something –
[email protected]: Datafyer> Обновить «QueueMetric» Установить «TotalCompletedMessages» = TotalCompletedMesseages +1 где «QueueName» = 'Test Queue one' и «Time» = now(); SyntaxException: Поддерживаются только выражения вида X = X +. –
AMH