2013-09-26 1 views
0

Моей CQL3 таблицы нравится этаPRIMARY KEY часть ColName не может быть ограничена в связи

CREATE TABLE stringindice (
    id text, 
    colname text, 
    colvalue blob, 
    PRIMARY KEY (id, colname, colvalue) 
) WITH COMPACT STORAGE 

и я вставил некоторые значения в нем. Теперь, когда я пытаюсь сделать что-то вроде этого:

QueryBuilder.select().all().from(keySpace, indTastringindice ble).where().and(QueryBuilder.eq("id", 'rowKey")).and(QueryBuilder.in("colname", "string1", "string2")); 

который является по существу

select * from stringindice where id = "rowkey" and colname IN ("string1", "string2") 

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

com.datastax.driver.core.exceptions.InvalidQueryException: PRIMARY KEY part colname cannot be restricted by IN relation 
at com.datastax.driver.core.exceptions.InvalidQueryException.copy(InvalidQueryException.java:35) 
at com.datastax.driver.core.ResultSetFuture.extractCauseFromExecutionException(ResultSetFuture.java:214) 
at com.datastax.driver.core.ResultSetFuture.getUninterruptibly(ResultSetFuture.java:169) 
at com.datastax.driver.core.Session.execute(Session.java:110) 

В документации CQL3 написано, что

«Более того, IN re lation разрешено только в последнем столбце ключа раздела и в последнем столбце полного первичного ключа. "

Похоже, что это не поддерживается !! Если да, то каков будет способ, если я должен использовать что-то вроде IN для одновременного приравнивания многих значений?

ответ

2

Это потому, что вы используете compact storage, поэтому составной столбец colname:colvalue (и значение пуст). Это означает, что colname не является последним столбцом полного первичного ключа.

Если вы не используете compact storage (который рекомендуется для всех новых моделей данных), то есть эквивалентная схема:

CREATE TABLE stringindice (
    id text, 
    colname text, 
    colvalue blob, 
    PRIMARY KEY (id, colname) 
); 

Тогда ваш IN запрос будет работать:

cqlsh:ks> insert into stringindice (id, colname, colvalue) VALUES ('rowkey', 'string1', '01'); 
cqlsh:ks> insert into stringindice (id, colname, colvalue) VALUES ('rowkey', 'string2', '02'); 
cqlsh:ks> insert into stringindice (id, colname, colvalue) VALUES ('rowkey', 'string3', '03'); 
cqlsh:ks> select * from stringindice where id = 'rowkey' and colname IN ('string1', 'string2'); 

id  | colname | colvalue 
--------+---------+---------- 
rowkey | string1 |  0x01 
rowkey | string2 |  0x02 
+0

Спасибо Richard , но, к сожалению, мы должны использовать Compact Storage по ряду других причин. Любая другая альтернатива нам в статье? – Easility

+0

Зачем вам компактное хранилище? Эта схема хранит значение colvalue внутри ключа столбца, поэтому оно ограничено до 64 КБ. Некомпактное хранилище очень похоже, за исключением того, что colvalue является фактическим значением столбца. – Richard

+0

Ну, это лучший способ сохранить наш широкий ряд рисунков бережливости. Вы можете увидеть больше причин в аналогичной дискуссии здесь https://groups.google.com/a/lists.datastax.com/forum/#!topic/java-driver-user/hgZnyVJhWCw – Easility

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

  • Нет связанных вопросов^_^