我有一个这样的表:
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/