Cassandra : DELETE doesn't work

标签 cassandra row cql

我有一个这样的表:

CREATE TABLE ab(group int,timestamp varchar,ab_id uuid, PRIMARY KEY (group,timestamp,ab_id)) WITH CLUSTERING ORDER BY (timestamp DESC);

布局:

1 | 2015-04-01 08:48:46 | 07d2a30d-79f3-5619-bbdd-6e5140a68ec3
1 | 2015-04-01 08:47:24 | 08d3a40c-85c7-5823-ddcc-7e6174d78dg4
1 | 2015-04-01 08:46:33 | c35dedeb-3144-5818-c282-53cd7ee1e8e8

我可以使用插入和选择查询,但无法删除行。 我必须使用所有主键,因为 DELETE 被保留,所以我尝试了:

 DELETE FROM ab WHERE ab_id=2d1ddf9a-2e80-41ea-b891-e322edfb905e  AND "timestamp"='2015-04-02 03:29:54' AND group = 1;

但是什么也没发生,没有消息错误,也没有删除行...??

最佳答案

when I do the select statement like the delete statement, it gives me (0 rows).

这(正如 LordKain 所指出的)意味着,如果您没有任何内容可以SELECT,那么您也没有任何内容可以DELETE

I can use a select statement if I create index on a column and do select * from this column with allow filtering

不要这样做。在我最近在这里回答的几个与查询相关的问题中,似乎有很多人认为使用 ALLOW FILTERING 的查询是一个好主意。这些用户通常会在一周左右回来,想知道为什么他们的 ALLOW FILTERING 查询突然因更多数据而超时。请求ALLOW FILTERING是 Cassandra 告诉您您正在尝试一些可能不应该做的事情的方式。

此外,二级索引不是你的 friend 。它们是为了方便而创建的,而不是为了性能。有些人甚至将它们的使用视为反模式。

Cassandra 被设计为按特定顺序通过特定键进行查询。如果您的表不适合您的查询,那么您需要构建一个适合您的查询的附加表。这将允许您在没有 ALLOW FILTERING 或二级索引的情况下执行查询。

When I try this (select * from ab where ab_id = xxxx), it says that I must enter the primary key timestamp, and when I do this, it says the same with the primary key group, and when I do this he found nothing and delete nothing.

这是因为DELETE操作需要特定的、完整的主键。对于您的情况,这应该有效:

DELETE FROM ab WHERE group=1 AND timestamp='2015-04-01 08:48:46' 
    AND ab_id=07d2a30d-79f3-5619-bbdd-6e5140a68ec3;

如果您缺少一个或多个主键组件,您的DELETE将不起作用。这就是将表中的每一列指定为主键的一部分的缺点。当您删除该行时,您将需要全部指定它们。

该规则的异常(exception)是您可以通过指定完整的分区键来删除。所以在你的情况下这应该有效:

DELETE FROM ab WHERE group=1;

当然,这将删除 group 分区键 1 下的所有行,因此这可能不是您想要的。

最重要的是,Cassandra 主键的行为与 RDBM 主键的行为不同。因此,您无法使用 RDBMS 思维方式构建 Cassandra 数据模型。

关于 Cassandra : DELETE doesn't work,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29404044/

相关文章:

hadoop - 如何将 Cassandra 与 Hadoop 集成以利用 Hive

"select * from CF where column in (..,..,..)"的 python CQL 查询替换

Android SQLite 从表中删除行,其中 2 个参数

php - 从数据库中选择位置和喜欢

cassandra - org.apache.thrift.transport.TTransportException : Cannot read. 远程端已关闭

java - Cassandra部署集群失败

Flutter - 行内的多行标签

java - 在 cassandra 中使用 TTL 指定列过期时间

cassandra - 如何在cassandra表中添加多列?

properties - 我如何使用 NDepend 找到哪些属性 getter 有副作用?