根据cassandra中的一个clusturing列值删除整行

时间:2018-03-26 02:31:03

标签: cassandra cassandra-3.0 cql3

我使用的架构如下:

CREATE TABLE mytable(
id int,
name varchar,
PRIMARY KEY ((id),name)
) WITH CLUSTERING ORDER BY (name desc);

我想通过以下命令删除记录:

DELETE FROM mytable WHERE name = 'Jhon';

但是给出错误

[Invalid query] message="Some partition key parts are missing: name"

当我查找原因时,我发现只有使用聚类列才能删除。

然后我试了

 DELETE FROM mytable WHERE id IN (SELECT id FROM mytable WHERE name='Jhon') AND name = 'Jhon';

但显然它不起作用。

然后我尝试将TTL设置为0以删除行。但是TTL只能设置为特定列,而不是整行。

执行此操作的可行替代方法是什么?

2 个答案:

答案 0 :(得分:2)

在Cassandra中,您需要设计数据模型以支持您的查询。查询数据时,始终必须提供分区键(否则查询效率低下)。

问题是您想要在没有分区键的情况下查询数据。您需要对数据进行非规范化以支持此类或请求。例如,您可以添加其他表格,例如:

CREATE TABLE id_by_name(
name varchar,
id int,
name varchar,
PRIMARY KEY (name, id)
) WITH CLUSTERING ORDER BY (id desc);

然后,您可以通过几个查询进行删除:

  1. 来自id_by_name的SELECT ID WHERE name ='John';
  2. 我们假设这会返回4.

    1. DELETE FROM mytable WHERE id = 4;
    2. DELETE FROM id_by_name WHERE name ='John'和id = 4;
    3. 您可以尝试利用物化视图(而不是维护自己的id_by_name),但物化视图目前标记为不稳定。

      现在,您需要在数据模型中解决一些问题,特别是如何处理具有相同名称的多个用户等...

答案 1 :(得分:1)

如果不完整,则无法删除主键。主要关键决策是分片和负载平衡。如果你不习惯在专栏中思考,卡桑德拉会变得复杂。

我不喜欢上面的答案,虽然它很好,但却使你的解决方案复杂化。如果你正在考虑关系,但在Cassandra迷路,我建议使用简化的东西,并将你的思想映射到关系视图。