Хотя ClickHouse ориентирован на аналитические рабочие нагрузки с большими объемами данных, в некоторых случаях существующие данные можно изменять или
удалять. Эти операции называются "мутациями" и выполняются с помощью команды ALTER TABLE.
Обновление данных
Используйте команду ALTER TABLE...UPDATE, чтобы обновить строки в таблице:
ALTER TABLE [<database>.]<table> UPDATE <column> = <expression> WHERE <filter_expr><expression> — это новое значение столбца для строк, удовлетворяющих условию <filter_expr>. <expression> должен иметь тот же тип данных, что и столбец, или приводиться к нему с помощью оператора CAST. <filter_expr> должен возвращать значение UInt8 (ноль или ненулевое) для каждой строки данных. Несколько операторов UPDATE <column> можно объединить в одной команде ALTER TABLE, разделив их запятыми.
Примеры:
-
Такая мутация позволяет обновить
visitor_id, заменив его новым значением с помощью поиска по словарю:ALTER TABLE website.clicks UPDATE visitor_id = getDict('visitors', 'new_visitor_id', visitor_id) WHERE visit_date < '2022-01-01' -
Изменение нескольких значений в одной команде может быть эффективнее, чем выполнение нескольких команд:
ALTER TABLE website.clicks UPDATE url = substring(url, position(url, '://') + 3), visitor_id = new_visit_id WHERE visit_date < '2022-01-01' -
Мутации можно выполнять с предложением
ON CLUSTERдля сегментированных таблиц:ALTER TABLE clicks ON CLUSTER main_cluster UPDATE click_count = click_count / 2 WHERE visitor_id ILIKE '%robot%'
Удаление данных
Для удаления строк используйте команду ALTER TABLE:
ALTER TABLE [<database>.]<table> DELETE WHERE <filter_expr>Выражение <filter_expr> должно возвращать значение UInt8 для каждой строки данных.
Примеры
-
Удалить все записи, в которых значение столбца содержится в массиве значений:
ALTER TABLE website.clicks DELETE WHERE visitor_id in (253, 1002, 4277) -
Что изменяет этот запрос?
ALTER TABLE clicks ON CLUSTER main_cluster DELETE WHERE visit_date < '2022-01-02 15:00:00' AND page_id = '573'
Подробнее см. на странице документации об операторе DELETE.
Легковесные удаления
Ещё один способ удалять строки — использовать команду DELETE FROM, которая называется легковесным удалением. Удалённые строки сразу помечаются как удалённые и автоматически исключаются из всех последующих запросов, поэтому не нужно ждать слияния частей или использовать ключевое слово FINAL. Очистка данных происходит асинхронно в фоновом режиме.
DELETE FROM [db.]table [ON CLUSTER cluster] [WHERE expr]Например, следующий запрос удаляет все строки из таблицы hits, в которых столбец Title содержит текст hello:
DELETE FROM hits WHERE Title LIKE '%hello%';Несколько замечаний о легковесных удалениях:
- Эта возможность доступна только для семейства движков таблиц
MergeTree. - По умолчанию легковесные удаления выполняются синхронно: операция ждёт, пока все реплики обработают удаление. Это поведение управляется настройкой
lightweight_deletes_sync.