2016-03-21 5 views
2

у меня есть Кассандра таблицы хуг со следующей схемой:Cassandra не поддерживает УДАЛИТЬ индексированные столбцы

create table xyz(
xyzid uuid, 
name text, 
fileid int, 
sid int, 
PRIMARY KEY(xyzid)); 

я создаю индекс на столбцах FILEID, с.и.д.:

CREATE INDEX file_index ON xyz (fileid); 
CREATE INDEX sid_index ON xyz (sid); 

вставить данные:

INSERT INTO xyz (xyzid, name , fileid , sid) VALUES (now(), 'p120' , 1, 100); 
INSERT INTO xyz (xyzid, name , fileid , ssid) VALUES (now(), 'p120' , 1, 101); 
INSERT INTO xyz (xyzid, name , fileid , sid) VALUES (now(), 'p122' , 2, 101); 

Я хочу удалить данные с помощью индексированных столбцов:

DELETE from xyz WHERE fileid=1 and sid=101; 

Зачем нужна эта ошибка?

InvalidRequest: code=2200 [Invalid query] message="Non PRIMARY KEY fileid found in where clause" 
  1. Обязательно ли указать первичный ключ в ИНЕКЕ для запросов на удаление?

  2. Поддерживает ли Cassandra удаление с использованием вторичного индекса s?

  3. Что нужно сделать для удаления данных с использованием вторичного индекса s?

  4. Любые предложения, которые могут помочь.

Я использую Data Stax Community Cassandra 2.1.8, но я также хочу знать, является ли удалить с помощью индексированных столбцов поддерживается данными Stax сообщества Cassandra 3.2.1

Благодаря

+0

Как часто вы действительно запрашиваете только PRIMARY KEY? Если эти индексы так важны для вас, почему бы вам не создать таблицу запросов, которая использует эти индексированные столбцы в качестве компонентов PRIMARY KEY? – Aaron

ответ

3

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

1) Да, если вы собираетесь использовать предложение where в инструкции CQL, тогда ключ PARTITION должен быть оператором равенства в предложении where. Помимо этого вам разрешено фильтровать только кластерные столбцы, указанные в вашем первичном ключе. (Если у вас нет вторичного индекса)

2) Нет, это не так. См. Это сообщение для получения дополнительной информации, поскольку это по сути та же проблема. Why can cassandra "select" on secondary key, but not update using secondary key? (1.2.8+)

3) Почему бы не добавить sid в качестве столбца кластеризации в вашем первичном ключе. Это позволит вам выполнить удаление или запрос с использованием обоих, как вы показали.

create table xyz( xyzid uuid, name text, fileid int, sid int, PRIMARY KEY(xyzid, sid));

4) В общем случае использования вторичных индексов считается анти-модель (немного меньше, так что с Саси индексов в C * 3.4), поэтому мой вопрос вы можете добавить эти поля как кластерные столбцы в первичной ключ? Как вы запрашиваете эти вторичные индексы?

+0

Плюс 1 от меня. Мне нравится ваш ответ на # 4 ... не могу подчеркнуть это достаточно. Слишком много людей рассматривают Кассандру как реляционную базу данных, а затем задаются вопросом, почему она не работает, как они думали. – Aaron

+0

@bechbd: Даже если я сохраняю поле «sid» в качестве столбца кластеризации. И запустите запрос DELETE из xyz, где sid = 101. В результате эта ошибка: «Некоторые части ключей разделов отсутствуют: xyzid». Один Sid определит конкретный набор данных в таблице. Я в основном хочу запустить запрос, который удалит все данные, имеющие сид, которые я упоминаю в предложении where. Если мне нужно будет указать «xyzid» вместе с «sid», чтобы удалить этот конкретный набор данных, принадлежащих «sid», как бы я это сделал? Для меня xyzid - это ничего, кроме того, что каждая строка уникальна. Что ты предлагаешь ? –

+0

В CQL вы всегда должны включать весь ключ PARTITION в предложение where, включающее при удалении. Поэтому из того, что вы указали здесь: '' One Sid определит определенный набор данных в таблице'', это привело бы меня к тому, что вы должны использовать поле 'sid' в качестве ключа PARTITION в вашей таблице, а не xyzid. – bechbd

1

Я полагаю, вы можете выполнить удаление в два этапа:

  1. Выбрать данные по средним индексом и получить первичный индекс столбца значения (xyzid) из результата запроса
  2. Perform удалить первичными значениями индекса.