- ADD COLUMN — Добавляет новый столбец в таблицу.
- DROP COLUMN — Удаляет столбец.
- RENAME COLUMN — Переименовывает существующий столбец.
- CLEAR COLUMN — Сбрасывает значения столбца.
- COMMENT COLUMN — Добавляет к столбцу текстовый комментарий.
- MODIFY COLUMN — Изменяет тип столбца, выражение по умолчанию, TTL и настройки столбца.
- MODIFY COLUMN REMOVE — Удаляет одно из свойств столбца.
- MODIFY COLUMN MODIFY SETTING — Изменяет настройки столбца.
- MODIFY COLUMN RESET SETTING — Сбрасывает настройки столбца.
- MATERIALIZE COLUMN — Материализует столбец в частях, где он отсутствует. Эти действия подробно описаны ниже.
ADD COLUMN
name, type, codec и default_expr (см. раздел Выражения по умолчанию).
Если указано условие IF NOT EXISTS, запрос не вернёт ошибку, если столбец уже существует. Если указать AFTER name_after (имя другого столбца), столбец будет добавлен после него в списке столбцов таблицы. Если вы хотите добавить столбец в начало таблицы, используйте условие FIRST. В противном случае столбец добавляется в конец таблицы. В цепочке действий name_after может быть именем столбца, добавленного одним из предыдущих действий.
Добавление столбца лишь изменяет структуру таблицы, не выполняя никаких действий с данными. После ALTER данные на диске не появляются. Если при чтении из таблицы для столбца отсутствуют данные, он заполняется значениями по умолчанию (путём вычисления выражения по умолчанию, если оно задано, либо с использованием нулей или пустых строк). Столбец появляется на диске после слияния частей данных (см. MergeTree).
Такой подход позволяет мгновенно выполнить запрос ALTER, не увеличивая объём старых данных.
Пример:
DROP COLUMN
name. Если указано условие IF EXISTS, запрос не вернёт ошибку, если такого столбца не существует.
Удаляет данные из файловой системы. Поскольку при этом удаляются файлы целиком, запрос выполняется почти мгновенно.
Пример:
RENAME COLUMN
name в new_name. Если указано IF EXISTS, запрос не вернёт ошибку, если столбец не существует. Поскольку переименование не затрагивает сами данные, запрос выполняется почти мгновенно.
ПРИМЕЧАНИЕ: Столбцы, указанные в ключевом выражении таблицы (либо в ORDER BY, либо в PRIMARY KEY), нельзя переименовывать. Попытка изменить эти столбцы приведёт к SQL Error [524].
Пример:
CLEAR COLUMN
COMMENT COLUMN
comment_expression, который возвращает запрос DESCRIBE TABLE.
Пример:
MODIFY COLUMN
name:
- Тип
- Выражение по умолчанию
- Кодек сжатия
- TTL
- Настройки на уровне столбца
IF EXISTS, запрос не вернёт ошибку, если столбец отсутствует.
При изменении типа значения преобразуются так, как если бы к ним были применены функции toType. Если изменяется только выражение по умолчанию, запрос не выполняет никаких сложных операций и завершается почти мгновенно.
Пример:
FIRST | AFTER, см. описание ADD COLUMN, но в этом случае указание типа столбца обязательно.
Пример:
ALTER является атомарным. Для таблиц MergeTree он также выполняется без блокировок.
Запрос ALTER на изменение столбцов реплицируется. Инструкции сохраняются в ZooKeeper, после чего каждая реплика применяет их. Все запросы ALTER выполняются в одном и том же порядке. Запрос ждёт завершения соответствующих действий на других репликах. Однако запрос на изменение столбцов в реплицируемой таблице может быть прерван, а все действия будут выполнены асинхронно.
Будьте осторожны при изменении столбца Nullable на Non-Nullable. Убедитесь, что в нём нет значений NULL, иначе это вызовет проблемы при чтении. В таком случае можно прервать мутацию и вернуть столбцу тип Nullable.
MODIFY COLUMN REMOVE
DEFAULT, ALIAS, MATERIALIZED, CODEC, COMMENT, TTL, SETTINGS.
Синтаксис:
MODIFY COLUMN MODIFY SETTING
max_compress_block_size для столбца на 1MB:
MODIFY COLUMN RESET SETTING
max_compress_block_size до значения по умолчанию:
MATERIALIZE COLUMN
DEFAULT или MATERIALIZED. При добавлении материализованного столбца с помощью ALTER TABLE table_name ADD COLUMN column_name MATERIALIZED существующие строки без материализованных значений автоматически не заполняются. Оператор MATERIALIZE COLUMN можно использовать, чтобы перезаписать существующие данные столбца после добавления или обновления выражения DEFAULT или MATERIALIZED (при этом обновляются только метаданные, а существующие данные не изменяются). Обратите внимание, что материализация столбца, входящего в ключ сортировки, — недопустимая операция, поскольку она может нарушить порядок сортировки.
Реализовано как мутация.
Для столбцов с новым или обновлённым выражением значения MATERIALIZED перезаписываются все существующие строки.
Для столбцов с новым или обновлённым выражением значения DEFAULT поведение зависит от версии ClickHouse:
- В ClickHouse < v24.2 перезаписываются все существующие строки.
- ClickHouse >= v24.2 различает, было ли значение в столбце с выражением значения
DEFAULTявно указано при вставке строки или нет, то есть вычислено на основе выражения значенияDEFAULT. Если значение было указано явно, ClickHouse оставляет его без изменений. Если значение было вычислено, ClickHouse изменяет его на новое или обновлённое выражение значенияMATERIALIZED.
- Если вы укажете PARTITION, будет материализован столбец только для указанной партиции.
Ограничения
ALTER позволяет создавать и удалять отдельные элементы (столбцы) во вложенных структурах данных, но не целые вложенные структуры данных. Чтобы добавить вложенную структуру данных, можно добавить столбцы с именем вида name.nested_name и типом Array(T). Вложенная структура данных эквивалентна нескольким столбцам типа Array, имя которых имеет одинаковый префикс до точки.
Переименование столбцов с точками в именах поддерживается лишь частично. Точки зарезервированы для доступа к подстолбцам Nested, поэтому префикс (имя родительского элемента) должен оставаться неизменным. Менять можно только суффикс (имя подстолбца). Например, a.b можно переименовать в a.c, но переименовать a.b в b.d нельзя, поскольку при этом изменяется родительский префикс Nested.
Удаление столбцов из первичного ключа или ключа выборки (столбцов, используемых в выражении ENGINE) не поддерживается. Изменение типа столбцов, входящих в первичный ключ, возможно только в том случае, если оно не приводит к изменению данных (например, можно добавлять значения в Enum или менять тип с DateTime на UInt32).
Если возможностей запроса ALTER недостаточно для внесения нужных изменений в таблицу, можно создать новую таблицу, скопировать в неё данные с помощью запроса INSERT SELECT, затем поменять таблицы местами с помощью запроса RENAME и удалить старую таблицу.
Запрос ALTER блокирует все чтения и записи для таблицы. Иными словами, если в момент выполнения запроса ALTER уже выполняется длительный SELECT, запрос ALTER будет ждать его завершения. В то же время все новые запросы к той же таблице будут ждать, пока выполняется этот ALTER.
Для таблиц, которые сами не хранят данные (например, Merge и Distributed), ALTER только изменяет структуру таблицы и не меняет структуру подчинённых таблиц. Например, при выполнении ALTER для таблицы Distributed вам также потребуется выполнить ALTER для таблиц на всех удалённых серверах.