cassandra-无法删除行

yh2wf1be  于 2021-06-10  发布在  Cassandra
关注(0)|答案(1)|浏览(426)

我想从casandra表中删除一个特定的行,但我不能。我可以从表中删除除此之外的任何其他内容。我将删除查询放在下面,但什么也没有发生:

cqlsh> delete from sales.tbl where orderid=999999 and orderdate='2019/01/01';
cqlsh>
cqlsh> select * from sales.tbl where orderid=999999 and orderdate='2019/01/01';

 orderid | orderdate  | country | itemtype | orderpriority | region        | saleschannel | shipdate   | totalcost | totalprofit | totalrevenue | unitcost | unitprice | unitssold
---------+------------+---------+----------+---------------+---------------+--------------+------------+-----------+-------------+--------------+----------+-----------+-----------
  999999 | 2019/01/01 |  Canada |    Stuff |             N | North America |      Offline | 2019/01/02 |       100 |           0 |          100 |        0 |         1 |         1

(1 rows)
cqlsh>

这是这张table的谢玛:

CREATE TABLE sales.tbl1 (
        orderid bigint,
        orderdate text,
        country text,
        itemtype text,
        orderpriority text,
        region text,
        saleschannel text,
        shipdate text,
        totalcost float,
        totalprofit float,
        totalrevenue float,
        unitcost float,
        unitprice float,
        unitssold int,
        PRIMARY KEY (orderid, orderdate) ) WITH CLUSTERING ORDER BY (orderdate ASC)
        AND bloom_filter_fp_chance = 0.01
        AND caching = {'keys': 'ALL', 'rows_per_partition': 'ALL'}
        AND comment = ''
        AND compaction = {'class': 'SizeTieredCompactionStrategy'}
        AND compression = {'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'}
        AND crc_check_chance = 1.0
        AND dclocal_read_repair_chance = 0.1
        AND default_time_to_live = 0
        AND gc_grace_seconds = 1
        AND max_index_interval = 2048
        AND memtable_flush_period_in_ms = 0
        AND min_index_interval = 128
        AND read_repair_chance = 0.0
        AND speculative_retry = '99.0PERCENTILE';

有什么建议吗?

oyt4ldly

oyt4ldly1#

如果在遥远的将来使用timetamp创建行,则可能会发生这种奇怪的情况。在cassandra和scylla中,客户机可能会为每次写入指定一个时间戳,而最新的时间戳将获胜,而不管更新的实际时间顺序如何。
例如,考虑一个客户机用时间戳1000写一行,稍后另一个客户机在时间戳900发送删除。删除不会删除任何内容-写入被认为是在删除之后发生的,因此删除被忽略。
有可能这正是发生在您身上的事情:一个配置错误的时钟的客户机使用了这个时钟,并创建了一个时间戳在遥远未来的行。当你现在尝试 delete from sales.tbl where orderid=999999 and orderdate='2019/01/01'; 当前时间用作此删除的时间戳,并且它比将来的时间戳早,因此删除被忽略。
要检查是否是这种情况,请尝试

select writetime(region) from sales.tbl where orderid=999999 and orderdate='2019/01/01';

这将显示项目中“region”列(例如)的writetime(即时间戳)。从unix时代(1970年1月1日午夜gmt)开始,这个时间是以微秒为单位的。如果是在将来,那我就猜对了你的问题。如果是这种情况,那么要真正删除这一行,您需要执行以下操作

delete from sales.tbl using timestamp 111111111 where orderid=999999 and orderdate='2019/01/01';

其中,时间戳“111111111”是(至少)比所述时间戳高一个的数字 select 给你看。

相关问题