Cassandra:用静态列删除最后一条记录

时间:2018-04-23 14:30:45

标签: 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;

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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