繁体   English   中英

com.datastax.driver.core.exceptions.InvalidQueryException:对于PRIMARY KEY部分无效的运算符IN

[英]com.datastax.driver.core.exceptions.InvalidQueryException: Invalid operator IN for PRIMARY KEY part

我有卡桑德拉2.1.15。 我有这张桌子

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

然后我尝试了:

        Session session = instances.getCqlSession();
        PreparedStatement statement = session.prepare("DELETE FROM ks_mobApp.messages WHERE pair_id = ? AND belong_to = ? AND message_id = ?;");
        Iterator<String> iterator = msgId.iterator();
        while(iterator.hasNext()) {
            try {
                session.executeAsync(statement.bind(pairId, currentUser.value("userId"), UUID.fromString(iterator.next())));
            } catch(Exception ex) {

            }
        }

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

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

仅分区键支持Delete IN关系)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM