当TTL在非主键列中到期时,更新后不会删除该行

时间:2016-08-04 14:30:54

标签: java cassandra

根据Cassandra文档,插入和更新的行为都相同。但是,如果我尝试以下命令:

CREATE TABLE IF NOT EXISTS my_keyspace.users (
   userId UUID,
   name TEXT,
   surname TEXT,
   phone TEXT
   PRIMARY KEY (userId, name, surname)
);

INSERT INTO my_keyspace.users (userId, name, surname, phone) 
VALUES (6f4c9ece-d47e-4582-a9e3-6c6f740f47d6, 'John', 'Doe', '555 5555 555') USING TTL 20;

UPDATE my_keyspace.users  USING TTL 10 SET phone = '777 777 777'
WHERE userId = 6f4c9ece-d47e-4582-a9e3-6c6f740f47d6 AND name = 'John' AND surname = 'Doe'
IF phone = '555 5555 555';

列值在10秒内设置为NULL,在20秒内删除整行

但如果我试试这个:

UPDATE my_keyspace.users  USING TTL 20 SET phone = '777 777 777' WHERE userId = 6f4c9ece-d47e-4582-a9e3-6c6f740f47d6 AND name = 'John' AND surname = 'Doe';

UPDATE my_keyspace.users  USING TTL 10 SET phone = '777 777 777' WHERE userId = 6f4c9ece-d47e-4582-a9e3-6c6f740f47d6 AND name = 'John' AND surname = 'Doe' IF phone = '555 5555 555';

整行将在10秒内删除。

有谁可以解释为什么在这种情况下行为不同以及主键列实际决定何时删除自己?

1 个答案:

答案 0 :(得分:0)

当主键的TTL过期且其所有列TTL都已过期时,该行将被删除。

您无法在更新语句中更改主键列的TTL,您可以使用新的TTL值将其挂起(从Cassandra 2.2.1开始,这适用于TTL' s比原始值小)。

您执行第二组更新语句所花费的时间可能足够长,整个行都将过期。我不能像你说的那样复制它。尝试将INSERT的TTL设置为更高的值,然后再按照您的说法进行观察。