Cassandra:删除带有静态列的最后一条记录
Cassandra: delete last record with static column
我们无法删除带有静态列的 table 中的最后一行。
我们已经尝试使用 Cassandra 2.2、3.0 和 3.11.2。复制因子为 1 或更多。
您可以通过创建以下 table 来重现此内容:
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:
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;
然后删除记录,但这需要不必要的应用程序逻辑才能完成。
该行为仅适用于具有共享静态列的最后一条记录,您可以使用多条记录填充 table 并成功删除这些记录,但最后一条将始终悬空。
每个分区都存在静态列,因此在您的情况下,分区 test:123
.
中的所有行都存在 last_modified
值 123
您的 DELETE
语句不会删除静态列,因为您指定了要删除的特定行。即使分区中没有剩余行,静态列也会保留。
要删除静态列你需要发出:
DELETE last_modified FROM playlists WHERE username = 'test' AND 'playlist_id' = 123;
这将从分区中删除静态列。
我们无法删除带有静态列的 table 中的最后一行。
我们已经尝试使用 Cassandra 2.2、3.0 和 3.11.2。复制因子为 1 或更多。
您可以通过创建以下 table 来重现此内容:
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:
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;
然后删除记录,但这需要不必要的应用程序逻辑才能完成。
该行为仅适用于具有共享静态列的最后一条记录,您可以使用多条记录填充 table 并成功删除这些记录,但最后一条将始终悬空。
每个分区都存在静态列,因此在您的情况下,分区 test:123
.
last_modified
值 123
您的 DELETE
语句不会删除静态列,因为您指定了要删除的特定行。即使分区中没有剩余行,静态列也会保留。
要删除静态列你需要发出:
DELETE last_modified FROM playlists WHERE username = 'test' AND 'playlist_id' = 123;
这将从分区中删除静态列。