PR关键部分colname不能受IN关系限制

时间:2013-09-26 12:35:09

标签: cassandra cql3 datastax-java-driver

我的CQL3表就像这样

  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关系只允许在最后一列   分区键和完整主键的最后一列。“

所以似乎不支持!!如果是的话,那么如果我必须使用类似IN的东西来同时将多个值等同起来,那会是什么样的呢?

1 个答案:

答案 0 :(得分: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