Поместите первичные ключи в Кассандру для обновления записи
У меня есть стол в Кассандре. Моя задача заключается в следующем: я хочу выбирать записи с временным диапазоном (поэтому отметка времени должна быть первичным ключом, а не использовать разрешающую фильтрацию), когда я вставляю запись, а идентификатор_поставщика и имя файла существуют в таблице, запись обновляется
CREATE TABLE test (
name text,
filename text,
timestamp timestamp,
is_deleted boolean,
PRIMARY KEY (provider_id, filename, timestamp)
)
2 ответа
Вы не можете обновить столбец первичного ключа, он вставит другую запись.
Вот как работает Кассандра.
Вы должны выбрать временную метку с помощью provider_id, имя файла, затем удалить с помощью provider_id, именем файла и временной меткой и заново вставить с новой временной меткой
Если вы хотите выбирать элементы в зависимости от временного диапазона, вы должны использовать кластеризацию столбцов. Ваше заявление о создании должно быть:
CREATE TABLE test (
provider_id UUID,
name text,
filename text,
timestamp timestamp,
is_deleted boolean,
PRIMARY KEY ((provider_id, filename), timestamp)
)
Теперь провайдер_ид + имя_файла - это ключ вашего раздела и метка времени вашего столбца кластеризации.
Составной ключ раздела состоит из
provider_id
а такжеfilename
, Столбец кластеризации,timestamp
определить порядок кластеризации данных. Как правило, Кассандра будет хранить столбцы, имеющие одинаковыеprovider_id
но другойfilename
на разных узлах и столбцах, имеющих одинаковыеprovider_id
а такжеfilename
на том же узле.
Это означает, что теперь вы можете запрашивать ваши данные следующим образом:
SELECT * FROM test
WHERE provider_id = 1
AND filename = "test.txt"
AND timestamp >= '2016-01-01 00:00:00+0200' AND ts <= '2016-08-13 23:59:00+0200'
И для возможного обновления:
UPDATE test
SET name = "test-new"
WHERE provider_id = 1
AND filename = "test.txt"
AND timestamp >= '2016-01-01 00:00:00+0200' AND ts <= '2016-08-13 23:59:00+0200'
Больше информации