com.datastax.driver.core.exceptions.InvalidQueryException:PRIMARY KEY部分的操作符IN无效

时间:2016-11-26 03:30:06

标签: cassandra datastax-java-driver

我有cassandra 2.1.15。 我有这张桌子

    <ActionButton buttonColor="rgba(30,144,255,1)" style={styles.fabIcon}
                  onPress={this.fabPress}>
    </ActionButton>


  fabPress() {
  this.props.navigator.push({
      component : DetaislView
    });
  }

我试图将多条记录删除为

CREATE TABLE ks_mobapp.messages (
    pair_id text,
    belong_to text,
    message_id timeuuid,
    cli_time bigint,
    sender text,
    text text,
    time bigint,
    PRIMARY KEY ((pair_id, belong_to), message_id)
) WITH CLUSTERING ORDER BY (message_id DESC)

我收到错误:

        instances.getCqlSession().execute(QueryBuilder.delete()
                .from(AppConstants.KEYSPACE, "messages")
                .where(QueryBuilder.eq("pair_id", pairId))
                .and(QueryBuilder.eq("belong_to", currentUser.value("userId")))
                .and(QueryBuilder.in("message_id", msgId)));

然后我尝试了:

Caused by: com.datastax.driver.core.exceptions.InvalidQueryException: Invalid operator IN for PRIMARY KEY part message_id

它的工作很好。这是正确的方法吗?我不能将IN用于相同的分区键吗?

2 个答案:

答案 0 :(得分:0)

查询中的DELETE仅支持分区键。

  

仅对分区键支持删除IN关系

答案 1 :(得分:0)

cassandra 2.x中的UPDATE和DELETE语句有一些WHERE子句限制

更具体地说,您只能在the last partition key column上使用IN运算符。因此,在您的情况下,最后一个分区列为belong_to。所以IN只能在该列上使用。

然而,在cassandra 3.0中删除了这些限制。它将允许

  

在任何分区键列

上指定IN      

在任何群集列上指定IN

这是补丁https://issues.apache.org/jira/browse/CASSANDRA-6237

另请阅读http://www.datastax.com/dev/blog/a-deep-look-to-the-cql-where-clause