Операции со столбцами
Набор запросов, которые позволяют изменять структуру таблицы.
Синтаксис:
В запросе укажите список из одного или нескольких действий, разделённых запятыми. Каждое действие — это операция над столбцом.
Поддерживаются следующие действия:
- 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 мгновенно, не увеличивая объём старых данных.
Пример:
Удаление столбца
Удаляет столбец с именем name. Если указано предложение IF EXISTS, запрос не завершится ошибкой, даже если столбец не существует.
Удаляет данные из файловой системы. Так как при этом удаляются целые файлы, запрос выполняется почти мгновенно.
Нельзя удалить столбец, если на него ссылается материализованное представление. В противном случае будет возвращена ошибка.
Пример:
ПЕРЕИМЕНОВАТЬ СТОЛБЕЦ
Переименовывает столбец name в new_name. Если указано предложение IF EXISTS, запрос не вернёт ошибку, даже если столбец не существует. Поскольку переименование не затрагивает исходные данные, запрос выполняется практически мгновенно.
ПРИМЕЧАНИЕ: Столбцы, указанные в ключевом выражении таблицы (с ORDER BY или PRIMARY KEY), не могут быть переименованы. Попытка изменить эти столбцы приведёт к ошибке SQL Error [524].
Пример:
ОЧИСТИТЬ СТОЛБЕЦ
Сбрасывает все данные в столбце для указанной партиции. Подробнее о задании имени партиции см. в разделе How to set the partition expression.
Если указано предложение IF EXISTS, запрос не вернёт ошибку, если столбец не существует.
Пример:
Столбец COMMENT
Добавляет комментарий к столбцу. Если указана клауза IF EXISTS, запрос не вернёт ошибку, если столбец отсутствует.
Каждый столбец может иметь только один комментарий. Если для столбца уже существует комментарий, новый комментарий перезаписывает предыдущий.
Комментарии хранятся в столбце comment_expression, возвращаемом запросом DESCRIBE TABLE.
Пример:
ИЗМЕНЕНИЕ СТОЛБЦА
Этот запрос изменяет свойства столбца name:
-
Тип
-
Выражение по умолчанию
-
Кодек сжатия
-
TTL
-
Настройки на уровне столбца
Примеры изменения кодеков сжатия столбцов см. в разделе Column Compression Codecs.
Примеры изменения TTL столбцов см. в разделе Column TTL.
Примеры изменения настроек на уровне столбца см. в разделе Column-level Settings.
Если указана конструкция IF EXISTS, запрос не вернёт ошибку, если столбец не существует.
При изменении типа значения преобразуются так, как если бы к ним были применены функции toType. Если изменяется только выражение по умолчанию, запрос не выполняет никаких сложных операций и завершается почти мгновенно.
Пример:
Изменение типа столбца — единственное сложное действие: оно изменяет содержимое файлов с данными. Для больших таблиц это может занять много времени.
Запрос также может изменить порядок столбцов с помощью клаузы FIRST | AFTER, см. описание ADD COLUMN, но в этом случае указание типа столбца обязательно.
Пример:
Запрос ALTER является атомарным. Для таблиц MergeTree он также не требует блокировок.
Запрос ALTER для изменения столбцов реплицируется. Инструкции сохраняются в ZooKeeper, после чего каждая реплика применяет их. Все запросы ALTER выполняются в одном и том же порядке. Запрос ожидает, пока соответствующие действия не будут завершены на других репликах. Однако запрос на изменение столбцов в реплицируемой таблице может быть прерван, и тогда все действия будут выполнены асинхронно.
Будьте осторожны при изменении столбца типа Nullable на Non-Nullable. Убедитесь, что он не содержит значений NULL, в противном случае это приведёт к проблемам при чтении из него. В таком случае обходным решением будет остановить мутацию (KILL MUTATION) и вернуть столбец к типу Nullable.
MODIFY COLUMN REMOVE
Удаляет одно из следующих свойств столбца: DEFAULT, ALIAS, MATERIALIZED, CODEC, COMMENT, TTL, SETTINGS.
Синтаксис:
Пример
Удалите TTL:
См. также
MODIFY COLUMN MODIFY SETTING
Изменяет параметр столбца.
Синтаксис:
Пример
Измените значение max_compress_block_size столбца на 1 МБ:
MODIFY COLUMN RESET SETTING
Сбрасывает настройку столбца и удаляет объявление этой настройки в определении столбца в запросе CREATE таблицы.
Синтаксис:
Пример
Сбросьте настройку столбца 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). Вложенная структура данных эквивалентна нескольким столбцам-массивам с именами с одинаковым префиксом до точки.
Не поддерживается удаление столбцов, входящих в первичный ключ или ключ выборки (столбцы, которые используются в выражении ENGINE). Изменение типа для столбцов, включённых в первичный ключ, возможно только в том случае, если это изменение не приводит к модификации данных (например, допускается добавлять значения в Enum или менять тип с DateTime на UInt32).
Если запроса ALTER недостаточно для внесения необходимых изменений в таблицу, вы можете создать новую таблицу, скопировать в неё данные с помощью запроса INSERT SELECT, затем переключить таблицы с помощью запроса RENAME и удалить старую таблицу.
Запрос ALTER блокирует все операции чтения и записи для таблицы. Другими словами, если во время выполнения запроса ALTER уже выполняется длительный SELECT, запрос ALTER будет ожидать его завершения. При этом все новые запросы к этой же таблице будут ожидать, пока выполняется этот ALTER.
Для таблиц, которые сами по себе не хранят данные (таких, как Merge и Distributed), ALTER лишь изменяет структуру таблицы и не изменяет структуру подчинённых таблиц. Например, при выполнении ALTER для таблицы Distributed вам также потребуется выполнить ALTER для таблиц на всех удалённых серверах.