2016-11-18 2 views
2

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

CREATE TABLE notification (
    postid double, 
    userid double, 
    type text, 
    message text, 
    hasread boolean, 
    postdate timestamp, 
    PRIMARY KEY (userid, postdate) 
) WITH CLUSTERING ORDER BY (postdate DESC); 

CREATE INDEX postid ON notification(postid); 

Допустим, я вставил несколько строк

select * from notification; 

userid | postdate      | hasread | message    | postid | type 
--------+---------------------------------+---------+------------------------+--------+--------- 
    104 | 2016-11-18 17:21:32.692000+0000 | False | Let\'s do it together! | 70521 | newpost 
    104 | 2016-11-18 17:21:26.511000+0000 | False | Let\'s do it together! | 90521 | newpost 
    103 | 2016-11-18 17:20:17.284000+0000 | False | Let\'s do it together! | 40521 | newpost 
    103 | 2016-11-18 17:20:02.925000+0000 | False | Let\'s do it together! | 40521 | newpost 
    103 | 2016-11-18 17:19:55.643000+0000 | False | Let\'s do it together! | 30521 | newpost 
    103 | 2016-11-18 17:19:49.029000+0000 | False | Let\'s do it together! | 60521 | newpost 

Если я простые запросы т.е.

select * from notification where postid=40521; 

то результат кажется штрафом

userid | postdate      | hasread | message    | postid | type 
--------+---------------------------------+---------+------------------------+--------+--------- 
    103 | 2016-11-18 17:20:17.284000+0000 | False | Let\'s do it together! | 40521 | newpost 
    103 | 2016-11-18 17:20:02.925000+0000 | False | Let\'s do it together! | 40521 | newpost 

Или давайте одну строку, как этот

select * from notification where postid=60521; 

снова один однорядные кажется отлично

userid | postdate      | hasread | message    | postid | type 
--------+---------------------------------+---------+------------------------+--------+--------- 
    103 | 2016-11-18 17:19:49.029000+0000 | False | Let\'s do it together! | 60521 | newpost 

Однако, когда я обновление hasread строки в одной строке, я получаю отсутствующая ошибка постданных, которая является столбцом кластеризации

update notification set hasread=true where postid=60521 and userid=103; 
InvalidRequest: Error from server: code=2200 [Invalid query] message="Some clustering keys are missing: postdate" 

Мне нужно получить список в отсортированном порядке, вот почему я должен использовать postdate для столбца кластеризации. Однако в то же время мне нужно обновить определенную строку. Я думаю, что речь идет о дизайне, но все еще не могла понять. Мы ценим любые предложения.

ответ

2

При обновлении строки в Кассандре вы должны предоставить свой весь ПЕРВЫЙ КЛЮЧ. Это то, что вам сообщает об этом сообщение об ошибке. Помните, что Cassandra NOT реляционная база данных, поэтому вы будете NOT сможете обновить на postid.

Кроме того, важно помнить, что Cassandra не проводит различия между INSERT и UPDATE. Поскольку уникальность конкретной строки определяется ее полным PRIMARY KEY, вы должны иметь все компоненты PRIMARY KEY для всех upserts. По сути, это то, что вам нужно сделать:

UPDATE notification SET hasread=true 
    WHERE userid=103 AND postdate='2016-11-18 17:19:49.029+0000'; 

Кроме того, это выглядит как postid столбец высокой мощности. Поэтому вызовы, полагающиеся на этот вторичный индекс, не будут работать хорошо. Вроде бы. Если вам действительно нужно запросить postid, вам следует создать дополнительную таблицу запросов для этого шаблона.

+0

Спасибо Аарон, кажется, что я должен получить сначала постдатировать и обновление в соответствии с ней – mehmetsen80

1

Вы не можете обновлять или удалять, указав не первичный столбец в where.

Предложение WHERE указывает строку или строки, подлежащие обновлению. Чтобы указать строку, предложение WHERE должно предоставить значение для каждого столбца первичного ключа строки. Чтобы указать более одной строки, вы можете использовать ключевое слово IN, чтобы ввести список возможных значений. Вы можете сделать это только для последнего столбца первичного ключа.обновление hasread

Давайте для = 60521 сообщения дан и идентификатор пользователя = 103 Сначала вам нужно выбрать постдатировать

SELECT postdate FROM notification where postid=60521 and userid=103; 

Вы получите postdate. Теперь вы можете обновить hasread поле с идентификатором пользователя и постдатировать

update notification set hasread=true where userid=103 and postdate=?; 
+0

две вещи неправильно с этим последним утверждением обновлений. Один, 'postid = 60521' в предложении WHERE не работает. Во-вторых, ваша миллисекундная точность слишком высока. CQL даст 'неспособность принудить ... к отформатированной дате'. – Aaron

+0

ой, извините, моя ошибка. Спасибо @Aaron –

Смежные вопросы