Cassandra:删除带有静态列的最后一条记录

标签 cassandra nosql cql cassandra-3.0

我们无法删除具有静态列的表中的最后一行。

我们尝试过 Cassandra 2.2、3.0 和 3.11.2。以 1 或更多作为复制因子。

您可以通过创建下表来重现此内容:

CREATE TABLE playlists (
    username text,
    playlist_id bigint,

    playlist_order bigint,

    last_modified bigint static,

    PRIMARY KEY ((username, playlist_id), playlist_order)
)
WITH CLUSTERING ORDER BY (playlist_order DESC);

然后插入一些测试数据:

INSERT INTO 
    playlists (
        username, 
        playlist_id, 
        playlist_order, 
        last_modified) 
    values (
        'test', 
        123, 
        123, 
        123);

然后删除该行:

DELETE FROM playlists WHERE username = 'test' AND playlist_id = 123 AND playlist_order = 123;

现在进行选择:

SELECT * FROM playlists WHERE username = 'test' AND playlist_id = 123;

您的结果应如下所示:

 username | playlist_id | playlist_order | last_modified
----------+-------------+----------------+---------------
     test |         123 |           null |           123

可以看到记录没有被删除,只是删除了聚类列。我们怀疑这与静态列有关,但除此之外无法解释。

但是,如果您在删除查询中省略集群键,如下所示:

DELETE FROM playlists WHERE username = 'test' AND playlist_id = 123;

然后记录被删除,但这需要不必要的应用程序逻辑来完成。

此行为仅适用于具有共享静态列的最后一条记录,您可以使用多条记录填充表并成功删除这些记录,但最后一条记录将始终处于悬空状态。

最佳答案

每个分区都存在静态列,因此在您的情况下,分区 test:123 中的所有行都存在 last_modified123

您的 DELETE 语句不会删除静态列,因为您正在指定要删除的特定行。即使分区中没有剩余行,静态列也将保留。

要删除静态列,您需要发出:

DELETE last_modified FROM playlists WHERE username = 'test' AND 'playlist_id' = 123;

这将从分区中删除静态列。

关于Cassandra:删除带有静态列的最后一条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49983635/

相关文章:

node.js - 根据键获取记录范围 - Aerospike

mysql - Redis 与 php mysql

cassandra - 在 Cassandra CQL 中,有没有办法查询集合列类型的大小?

java - 如何在 Java 中使用 spark 将几列保存到 cassandra

java - 每个搜索 cassandra lucene 索引多个过滤器

mysql - 如何在 MySQL 和 Cassandra 中获取行组

indexing - Cassandra的索引结构是怎样的

mongodb - 如何重启 MongoDB 服务器并关闭 Cloud 9 上的终端

python - cassandra cql 是否支持聚合函数,如 group by 和 order by

cassandra - 如何获取 Cassandra 中所有记录的主键?