Clickhouse - кросс-таблица TTL выражений - PullRequest
0 голосов
/ 02 апреля 2020

Можно ли определить TTL для таблицы в Clickhouse, чтобы она ссылалась на другую таблицу? Допустим, у меня есть приложение чата и в моей базе данных есть две таблицы: чаты и chat_messages. Чаты имеют информацию о времени начала и окончания, и я хочу полностью удалить старые чаты вместе с их сообщениями по истечении срока их действия - так, основываясь на чате stop_time. Я попытался создать эти таблицы следующим образом:

db43af298bb9 :) CREATE TABLE chats (id Int64, start_time DateTime, stop_time DateTime) ENGINE = MergeTree() ORDER BY (start_time, id) TTL stop_time + INTERVAL 1 MONTH;

CREATE TABLE chats
(
    `id` Int64, 
    `start_time` DateTime, 
    `stop_time` DateTime
)
ENGINE = MergeTree()
ORDER BY (start_time, id)
TTL stop_time + toIntervalMonth(1)

Ok.

0 rows in set. Elapsed: 0.014 sec. 

db43af298bb9 :) CREATE TABLE chat_messages (id Int64, text String, chat_id Int64) ENGINE = MergeTree() ORDER BY id TTL (SELECT stop_time from chats where chats.id = chat_id) + INTERVAL 1 MONTH;

CREATE TABLE chat_messages
(
    `id` Int64, 
    `text` String, 
    `chat_id` Int64
)
ENGINE = MergeTree()
ORDER BY id
TTL 
(
    SELECT stop_time
    FROM chats
    WHERE chats.id = chat_id
) + toIntervalMonth(1)

Received exception from server (version 19.16.10):
Code: 47. DB::Exception: Received from localhost:9000. DB::Exception: Missing columns: 'chat_id' while processing query: 'SELECT stop_time FROM chats WHERE id = chat_id', required columns: 'id' 'chat_id' 'stop_time', source columns: 'stop_time' 'id' 'start_time'. 

0 rows in set. Elapsed: 0.017 sec.

Определение TTL для второй таблицы не выполняется, поскольку он пытается найти столбец 'call_id' в таблице 'chats' вместо исходной таблицы 'chat_messages' , Возможно ли то, что я пытаюсь достичь, или я вынужден использовать вместо этого механизм ALTER DELETE?

...