Ошибка отношения Non-EQ Cassandra - как исправить первичный ключ?

Я создал одну таблицу posts. Когда я делаю запрос SELECT:

return $this->db->query('SELECT * FROM "posts" WHERE "id" IN(:id) LIMIT '.$this->limit_per_page, ['id' => $id]);

Я получаю сообщение об ошибке:

Столбец PRIMARY KEY «id» не может быть ограничен (предыдущий столбец «post_at» либо не ограничен, либо не связан с EQ)

Мой дамп таблицы:

CREATE TABLE posts (
  id       uuid,
  post_at  timestamp,
  user_id  bigint,
  name     text,
  category set<text>,
  link     varchar,
  image    set<varchar>,
  video    set<varchar>,
  content  map<text, text>,
  private  boolean,
  PRIMARY KEY (user_id,post_at,id)
  )
  WITH CLUSTERING ORDER BY (post_at DESC);

Я прочитал какую-то статью о ПЕРВИЧНЫХ И КЛАСТЕРНЫХ КЛЮЧАХ и понял, что когда есть несколько первичных ключей - мне нужно использовать оператор = с IN. В моем случае я не могу использовать один ПЕРВИЧНЫЙ КЛЮЧ. Что вы мне посоветуете изменить в структуре таблицы, чтобы ошибка исчезла?


person Alice    schedule 30.08.2014    source источник
comment
просто попробуйте поменять местами user_id и id в первичном ключе. Также для использования оператора = добавьте столбец, значение которого вы знаете, например, clom1 со значением 1.   -  person undefined_variable    schedule 30.08.2014
comment
Нет такого clom1, как я знаю, все содержимое разное, я могу создать дополнительный clom1 и добавить, что всегда есть значение 1 для каждой строки?   -  person Alice    schedule 30.08.2014
comment
да, вам нужно будет создать столбец с фиксированным значением, которое вы можете использовать   -  person undefined_variable    schedule 30.08.2014
comment
Я изменяю то, что вы посоветовали: Запросите сейчас: return $this->db->query('SELECT * FROM "posts" WHERE "index_field" = :index AND "id" IN(:id) LIMIT '.$this->limit_per_page, ['id' => $id, 'index' => 1]); Get error: 'Syntax_error: line 1:45 no viable alternative at input 'index'   -  person Alice    schedule 30.08.2014
comment
Пожалуйста, не могли бы вы ответить мне более подробно с примером? Спасибо   -  person Alice    schedule 30.08.2014
comment
Я изменил местами user_id и id в первичном ключе и использовал запрос select * из сообщений, где id в (идентификаторы, разделенные запятыми)   -  person undefined_variable    schedule 30.08.2014
comment
Я тоже менял, но не работает :PRIMARY KEY (id, post_at, user_id)   -  person Alice    schedule 30.08.2014
comment
Мне нужно использовать WHERE для столбца user_id Если я изменю - это будет wotk: PRIMARY KEY column "user_id" cannot be restricted (preceding column "post_at" is either not restricted or by a non-EQ relation) Я предлагаю вам написать ответ с более подробной информацией, чтобы мы понимали друг друга   -  person Alice    schedule 30.08.2014


Ответы (1)


Моя фиктивная структура таблицы

CREATE TABLE posts (
  id       timeuuid,
  post_at  timestamp,
  user_id  bigint,
  PRIMARY KEY (id,post_at,user_id)
  )
  WITH CLUSTERING ORDER BY (post_at DESC);

И после вставки некоторых фиктивных данных

Я выполнил запрос select * from posts where id in (timeuuid1,timeuuid2,timeuuid3);

Я использовал cassandra 2.0 с cql 3.0.

person undefined_variable    schedule 30.08.2014
comment
Спасибо, не могли бы вы проверить, работает ли LIMIT по вашему запросу? Также я использую поле user_id для оператора WHERE. Я уже говорил об этом, пожалуйста, попробуйте с полем user_id. Большое спасибо. - person Alice; 30.08.2014
comment
Ой, извините, я сам запутался. сейчас проверю вашу версию - person Alice; 30.08.2014
comment
Когда я использую запрос: SELECT * FROM "posts" WHERE "id" IN(20b40eb5-4174-4762-a7fe-1ab8299e5da3, 627a42e1-64a0-4be8-b307-a012b8a8d889); В результате запроса я получаю 0 строк, однако в таблице posts есть идентификатор с тем же id UUID - person Alice; 30.08.2014
comment
если вы используете кластер cassandra, это может быть проблемой согласованности. Также почему имя таблицы и имя столбца в кавычках? - person undefined_variable; 30.08.2014
comment
Да, спасибо, вы профи. Но небольшой вопрос, как сравнить значение true/false в операторе WHERE? - person Alice; 30.08.2014
comment
Согласно документации логические типы данных используются как строки. - person undefined_variable; 30.08.2014