我使用的架构如下:
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只能设置为特定列,而不是整行。
执行此操作的可行替代方法是什么?
答案 0 :(得分:2)
在Cassandra中,您需要设计数据模型以支持您的查询。查询数据时,始终必须提供分区键(否则查询效率低下)。
问题是您想要在没有分区键的情况下查询数据。您需要对数据进行非规范化以支持此类或请求。例如,您可以添加其他表格,例如:
CREATE TABLE id_by_name(
name varchar,
id int,
name varchar,
PRIMARY KEY (name, id)
) WITH CLUSTERING ORDER BY (id desc);
然后,您可以通过几个查询进行删除:
我们假设这会返回4.
您可以尝试利用物化视图(而不是维护自己的id_by_name),但物化视图目前标记为不稳定。
现在,您需要在数据模型中解决一些问题,特别是如何处理具有相同名称的多个用户等...
答案 1 :(得分:1)
如果不完整,则无法删除主键。主要关键决策是分片和负载平衡。如果你不习惯在专栏中思考,卡桑德拉会变得复杂。
我不喜欢上面的答案,虽然它很好,但却使你的解决方案复杂化。如果你正在考虑关系,但在Cassandra迷路,我建议使用简化的东西,并将你的思想映射到关系视图。