Как сделать запрос в Кассандре Если у меня есть два ключа кластера в семействе столбцов

У меня есть семейство столбцов и синтаксис, как это:

CREATE TABLE sr_number_callrecord ( 
  id int, 
  callerph text, 
  sr_number text, 
  callid text, 
  start_time text, 
  plan_id int, 
  PRIMARY KEY((sr_number), start_time, callerph) 
);

Я хочу сделать запрос, как:

  a) select * from dummy where sr_number='+919xxxx8383' 
                   and start_time >='2014-12-02 08:23:18' limit 10;

  b)  select * from dummy where sr_number='+919xxxxxx83' 
                          and start_time >='2014-12-02 08:23:18' 
                          and callerph='+9120xxxxxxxx0' limit 10;

Первый запрос работает нормально, но второй запрос дает ошибку, как

Bad Request: PRIMARY KEY column "callerph" cannot be restricted 
(preceding column "start_time" is either not restricted or by a non-EQ 
relation)  

Если я получу результат в первом запросе, во втором запросе я просто добавлю один
больше ключа кластера, чтобы получить результат фильтрации, и строка будет меньше

2 ответа

Решение

Точно так же, как вы не можете пропустить компоненты PRIMARY KEY, вы можете использовать оператор "Не равно" в последнем компоненте, который вы запрашиваете (именно поэтому ваш первый запрос работает).

Если вам нужно обслуживать оба запроса, перечисленных выше, вам понадобятся отдельные таблицы запросов для каждого из них. Для обслуживания второго запроса таблица запросов (с такими же столбцами) будет работать, если вы определите ее с ПЕРВИЧНЫМ КЛЮЧОМ следующим образом:

PRIMARY KEY((sr_number), callerph, start_time)

Таким образом, вы по-прежнему задаете части своего ПЕРВИЧНОГО КЛЮЧА по порядку, а ваше условие неравенства относится к последнему компоненту ПЕРВИЧНОГО КЛЮЧА.

Существуют определенные ограничения в использовании столбцов первичного ключа в предложении where http://docs.datastax.com/en/cql/3.1/cql/cql_reference/select_r.html

Одним из решений, которое будет работать в вашей ситуации, является изменение порядка кластеризации столбцов в первичном ключе.

CREATE TABLE sr_number_callrecord ( 
id int, 
callerph text, 
sr_number text, 
callid text, 
start_time text, 
plan_id int, 
PRIMARY KEY((sr_number),  callerph, start_time,) 
);

Теперь вы можете использовать запрос диапазона в последнем столбце как

select * from sr_number_callrecord where sr_number = '1234' and callerph  = '+91123' and start_time >= '1234';
Другие вопросы по тегам