【问题标题】:Cassandra, Delete if a set contains valueCassandra,如果集合包含值则删除
【发布时间】:2020-07-29 16:57:26
【问题描述】:

我是 Cassandra 的初学者,我有一张这样的表:

CREATE TABLE Books(
Title text PRIMARY KEY,
Authors set<text>,
Family set <text>,
Publisher text,
Price decimal
);

(其他选项没有,因为这只是一个例子)

现在我想执行这个查询:

DELETE Price FROM Books WHERE Authors CONTAINS 'J.K. Rowling' IF EXISTS;

但它不起作用。我在 Google 上搜索,但一无所获。

希望有人可以帮助我,如果我的英语不是很好,请见谅。

【问题讨论】:

    标签: cassandra cql cassandra-3.0 cqlsh cql3


    【解决方案1】:

    但它不起作用。

    这并没有真正为我们提供足够的信息来帮助您。通常,您需要提供错误消息。我在本地构建了您的表,插入了数据,并尝试了您的方法。这是我看到的错误:

    InvalidRequest: Error from server: code=2200 [Invalid query]
       message="Some partition key parts are missing: title"
    

    DELETE 要求在 WHERE 子句中指定适当的 PRIMARY KEY 组件。在您的情况下,Authors 不是 PRIMARY KEY 定义的一部分。鉴于返回的错误消息(和表定义),指定 title 是从该表中删除行的唯一方法。

    aploetz@cqlsh:stackoverflow> DELETE FROM Books 
        WHERE title = 'Harry Potter and the Chamber of Secrets'
        IF EXISTS;
    
     [applied]
    -----------
          True
    

    我可以做这样的查询吗? UPDATE Books SET Family = Family + {'Fantasy'} WHERE Authors CONTAINS 'J.K. Rowling';

    没有。出于同样的原因,这失败了。 Cassandra 中的写入(插入、更新、删除都是写入)需要 WHERE 子句中的主键(特别是分区键)。没有它,Cassandra 无法确定哪个节点保存数据,它需要它来执行写入。

    【讨论】:

    • 非常感谢。如果可能的话,我还有另一个问题:我可以做这样的查询吗?更新书籍集家庭 = 家庭 + {'Fantasy'} 其中作者包含'J.K.罗琳';
    • @Matteo 编辑完成。
    猜你喜欢
    • 2013-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-18
    • 2021-09-23
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    相关资源
    最近更新 更多