ALTER TABLE [db.]table [ON CLUSTER cluster] UPDATE column1 = expr1 [, ...] [IN PARTITION partition_id] WHERE filter_exprИзменяет данные, соответствующие указанному условию фильтрации. Реализовано как мутация.
filter_expr должен иметь тип UInt8. Этот запрос обновляет значения указанных столбцов значениями соответствующих выражений в строках, для которых filter_expr принимает ненулевое значение. Значения приводятся к типу столбца с помощью оператора CAST. Обновление столбцов, которые используются при вычислении первичного ключа или ключа партиционирования, не поддерживается.
Один запрос может содержать несколько команд, разделённых запятыми.
Синхронность обработки запроса определяется настройкой mutations_sync. По умолчанию обработка выполняется асинхронно.
См. также
- Мутации
- Синхронность запросов ALTER
- настройка mutations_sync
- Легковесный
UPDATE- Альтернативное легковесное обновление с использованием патч-частей APPLY PATCHES- Ручное применение патчей из легковесных обновлений
Материализованные столбцы
Значение столбца MATERIALIZED, выражение которого использует обновлённый
столбец, пересчитывается в ходе мутации, поэтому оно остаётся согласованным с новыми данными.
Столбцы, вычисляемые на основе EPHEMERAL-столбцов
Столбец EPHEMERAL существует только во время выполнения
INSERT и никогда не сохраняется, поэтому MATERIALIZED-столбец, вычисляемый на его основе, нельзя пересчитать с помощью
мутации. Такой столбец сохраняет значение, вычисленное во время INSERT, которое впоследствии перестаёт соответствовать его
выражению:
CREATE TABLE test
(
x Int32,
e Int32 EPHEMERAL 0,
m Int32 MATERIALIZED x + e
)
ENGINE = MergeTree
ORDER BY tuple();
INSERT INTO test (x, e) VALUES (1, 7);
ALTER TABLE test UPDATE x = 2 WHERE 1;
SELECT x, m FROM test;┌─x─┬─m─┐
│ 2 │ 8 │
└───┴───┘m равно 8 — значению, вычисленному при выполнении INSERT, а не 2 + 7: значение e недоступно
за пределами INSERT, в котором оно было задано. Если по этой причине мутация пропускает
столбец, она записывает предупреждение в журнал сервера. Чтобы обновить такой столбец, повторно выполните INSERT для затронутых строк.