【问题标题】:Delete operation on a CQL3 table in CassandraCassandra 中对 CQL3 表的删除操作
【发布时间】:2013-07-15 15:02:40
【问题描述】:

假设我使用 CQL3 创建了以下列族:

    CREATE TABLE users (
        id text,
        freq int,
        duration bigint,
        PRIMARY KEY (id, freq)
    )with clustering order by (freq desc);

我在其中插入了一些数据,例如:

    Row(id=u'key', freq=3, duration=1)
    Row(id=u'key', freq=4, duration=2)
    Row(id=u'key', freq=5, duration=4)
    Row(id=u'key', freq=6, duration=6)

现在我想做一个更新操作。准确地说,我想更新上面给出的特定行的“频率”值。由于 CQL3 不允许我直接更新主键部分;我必须先删除该条目,然后再插入。但问题是它不允许我使用非分区键列“持续时间”执行删除操作。例如,它不允许我执行此操作:

    Delete from users where id ='key' and duration =1;

有人知道解决这个问题的方法吗?我真的很感激。

【问题讨论】:

    标签: cassandra cql cql3


    【解决方案1】:

    是时候重新考虑您的元模型了。尽量保持您的元模型灵活,以支持所有此类操作。换句话说,您的元模型的复合键组合应该具有处理此类删除或更新相关查询的灵活性。

    现在来看你的例子,如果你想更新 freq 列,那么首先你必须删除具有该频率值的行,然后重新插入一个正确的组合。尝试使用您的复合键组合删除该行,例如您的情况,

    delete from users where id ='key' AND freq= 3
    

    然后你可以插入一个新的新行。

    【讨论】:

    • 谢谢阿比;我将 freq 作为主键的唯一原因是我希望数据按 w.r.t 排序。但我明白你的意思;它解决了我的问题。
    • 这会为表创建很多墓碑,如果你做很多这样的操作,查询会随着时间的推移变得越来越慢,请注意这一点。
    【解决方案2】:

    听起来您的架构不适合您想要执行的操作。您应该从弄清楚要对数据执行的操作开始,然后设计一个支持它的模式。

    如果你的架构不支持你想做的事情,它永远不会成功。如果您更详细地描述您所做的工作,包括您需要执行的操作类型,也许我们可以帮助您设计更好的架构。

    【讨论】:

    • 感谢 Theo 的回复。我确实设计了架构来支持我的查询。我将频率作为主键的一部分的原因是我想对我的表进行排序 w.r.t 频率。并且由于频率会随着时间的推移而更新;我也需要更新它。
    猜你喜欢
    • 1970-01-01
    • 2019-07-02
    • 1970-01-01
    • 2013-01-12
    • 2013-08-09
    • 1970-01-01
    • 2014-03-07
    • 2013-11-03
    • 2013-08-09
    相关资源
    最近更新 更多