Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

ALTER TABLE ... UPDATE

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. По умолчанию обработка выполняется асинхронно.

См. также

Материализованные столбцы

Значение столбца 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 для затронутых строк.

Navigation