Кассандра, Удалить, если набор содержит значение - PullRequest
1 голос
/ 16 апреля 2020

Я новичок в Кассандре, и у меня есть такая таблица:

CREATE TABLE Books(
Title text PRIMARY KEY,
Authors set<text>,
Family set <text>,
Publisher text,
Price decimal
);

(другие опции отсутствуют, потому что это только пример)

Теперь я хотел бы выполнить этот запрос:

DELETE Price FROM Books WHERE Authors CONTAINS 'J.K. Rowling' IF EXISTS;

Но это не работает. Я искал в Google, но ничего не нашел.

Надеюсь, кто-нибудь может мне помочь, и извините, если мой английский sh не очень хорош.

1 Ответ

3 голосов
/ 16 апреля 2020

но это не работает.

Это не дает нам достаточно информации, чтобы помочь вам. Обычно вы хотите предоставить сообщение об ошибке. Я создал вашу таблицу локально, вставил данные и попробовал ваш подход. Я вижу эту ошибку:

InvalidRequest: Error from server: code=2200 [Invalid query]
   message="Some partition key parts are missing: title"

DELETE требует, чтобы в предложении WHERE были указаны соответствующие компоненты PRIMARY KEY. В вашем случае Authors является , а не частью определения PRIMARY KEY. Учитывая возвращенное сообщение об ошибке (и определение таблицы), указав title, это единственный способ удалить строки из этой таблицы.

aploetz@cqlsh:stackoverflow> DELETE FROM Books 
    WHERE title = 'Harry Potter and the Chamber of Secrets'
    IF EXISTS;

 [applied]
-----------
      True

Могу ли я выполнить такой запрос? UPDATE Books SET Family = Family + {'Fantasy'} WHERE Authors CONTAINS 'J.K. Rowling';

Нет. Это терпит неудачу по той же причине. При записи в Cassandra (INSERT, UPDATE, DELETE - все записи) требуется первичный ключ (в частности, ключ раздела) в предложении WHERE. Без этого Кассандра не может выяснить, на каком узле хранятся данные, и ей это необходимо для выполнения записи.

...