* DOCSUP-2806: Add meta intro. * DOCSUP-2806: Update meta intro. * DOCSUP-2806: Fix meta. * DOCSUP-2806: Add quotes for meta headers. * DOCSUP-2806: Remove quotes from meta headers. * DOCSUP-2806: Add meta headers. * DOCSUP-2806: Fix quotes in meta headers. * DOCSUP-2806: Update meta headers. * DOCSUP-2806: Fix link to nowhere in EN. * DOCSUP-2806: Fix link (settings to tune) * DOCSUP-2806: Fix links. * DOCSUP-2806:Fix links EN * DOCSUP-2806: Fix build errors. * DOCSUP-2806: Fix meta intro. * DOCSUP-2806: Fix toc_priority in examples datasets TOC. * DOCSUP-2806: Fix items order in toc. * DOCSUP-2806: Fix order in toc. * DOCSUP-2806: Fix toc order. * DOCSUP-2806: Fix order in toc. * DOCSUP-2806: Fix toc index in create * DOCSUP-2806: Fix toc order in create. Co-authored-by: romanzhukov <romanzhukov@yandex-team.ru> Co-authored-by: alexey-milovidov <milovidov@yandex-team.ru>
12 KiB
toc_priority | toc_title |
---|---|
37 | Манипуляции со столбцами |
Манипуляции со столбцами
Существуют следующие действия:
- ADD COLUMN — добавляет столбец в таблицу;
- DROP COLUMN — удаляет столбец;
- CLEAR COLUMN — сбрасывает все значения в столбце для заданной партиции;
- COMMENT COLUMN — добавляет комментарий к столбцу;
- MODIFY COLUMN — изменяет тип столбца, выражение для значения по умолчанию и TTL.
Подробное описание для каждого действия приведено ниже.
ADD COLUMN
ADD COLUMN [IF NOT EXISTS] name [type] [default_expr] [codec] [AFTER name_after]
Добавляет в таблицу новый столбец с именем name
, типом type
, кодеком codec
и выражением для умолчания default_expr
(смотрите раздел Значения по умолчанию).
Если указано IF NOT EXISTS
, запрос не будет возвращать ошибку, если столбец уже существует. Если указано AFTER name_after
(имя другого столбца), то столбец добавляется (в список столбцов таблицы) после указанного. Иначе, столбец добавляется в конец таблицы. Обратите внимание, ClickHouse не позволяет добавлять столбцы в начало таблицы. Для цепочки действий, name_after
может быть именем столбца, который добавляется в одном из предыдущих действий.
Добавление столбца всего лишь меняет структуру таблицы, и не производит никаких действий с данными - соответствующие данные не появляются на диске после ALTER-а. При чтении из таблицы, если для какого-либо столбца отсутствуют данные, то он заполняется значениями по умолчанию (выполняя выражение по умолчанию, если такое есть, или нулями, пустыми строками). Также, столбец появляется на диске при слиянии кусков данных (см. MergeTree).
Такая схема позволяет добиться мгновенной работы запроса ALTER
и отсутствия необходимости увеличивать объём старых данных.
Пример:
ALTER TABLE visits ADD COLUMN browser String AFTER user_id
DROP COLUMN
DROP COLUMN [IF EXISTS] name
Удаляет столбец с именем name
. Если указано IF EXISTS
, запрос не будет возвращать ошибку, если столбца не существует.
Запрос удаляет данные из файловой системы. Так как это представляет собой удаление целых файлов, запрос выполняется почти мгновенно.
Пример:
ALTER TABLE visits DROP COLUMN browser
CLEAR COLUMN
CLEAR COLUMN [IF EXISTS] name IN PARTITION partition_name
Сбрасывает все значения в столбце для заданной партиции. Если указано IF EXISTS
, запрос не будет возвращать ошибку, если столбца не существует.
Как корректно задать имя партиции, см. в разделе Как задавать имя партиции в запросах ALTER.
Пример:
ALTER TABLE visits CLEAR COLUMN browser IN PARTITION tuple()
COMMENT COLUMN
COMMENT COLUMN [IF EXISTS] name 'Text comment'
Добавляет комментарий к таблице. Если указано IF EXISTS
, запрос не будет возвращать ошибку, если столбца не существует.
Каждый столбец может содержать только один комментарий. При выполнении запроса существующий комментарий заменяется на новый.
Посмотреть комментарии можно в столбце comment_expression
из запроса DESCRIBE TABLE.
Пример:
ALTER TABLE visits COMMENT COLUMN browser 'Столбец показывает, из каких браузеров пользователи заходили на сайт.'
MODIFY COLUMN
MODIFY COLUMN [IF EXISTS] name [type] [default_expr] [TTL]
Запрос изменяет следующие свойства столбца name
:
-
Тип
-
Значение по умолчанию
-
TTL
Примеры изменения TTL столбца смотрите в разделе [TTL столбца](ttl.md#mergetree-column-ttl).
Если указано IF EXISTS
, запрос не возвращает ошибку, если столбца не существует.
При изменении типа, значения преобразуются так, как если бы к ним была применена функция toType. Если изменяется только выражение для умолчания, запрос не делает никакой сложной работы и выполняется мгновенно.
Пример запроса:
ALTER TABLE visits MODIFY COLUMN browser Array(String)
Изменение типа столбца - это единственное действие, которое выполняет сложную работу - меняет содержимое файлов с данными. Для больших таблиц, выполнение может занять длительное время.
Выполнение производится в несколько стадий:
- подготовка временных (новых) файлов с изменёнными данными;
- переименование старых файлов;
- переименование временных (новых) файлов в старые;
- удаление старых файлов.
Из них, длительной является только первая стадия. Если на этой стадии возникнет сбой, то данные не поменяются. Если на одной из следующих стадий возникнет сбой, то данные будет можно восстановить вручную. За исключением случаев, когда старые файлы удалены из файловой системы, а данные для новых файлов не доехали на диск и потеряны.
Запрос ALTER
на изменение столбцов реплицируется. Соответствующие инструкции сохраняются в ZooKeeper, и затем каждая реплика их применяет. Все запросы ALTER
выполняются в одном и том же порядке. Запрос ждёт выполнения соответствующих действий на всех репликах. Но при этом, запрос на изменение столбцов в реплицируемой таблице можно прервать, и все действия будут осуществлены асинхронно.
Ограничения запроса ALTER
Запрос ALTER
позволяет создавать и удалять отдельные элементы (столбцы) вложенных структур данных, но не вложенные структуры данных целиком. Для добавления вложенной структуры данных, вы можете добавить столбцы с именем вида name.nested_name
и типом Array(T)
- вложенная структура данных полностью эквивалентна нескольким столбцам-массивам с именем, имеющим одинаковый префикс до точки.
Отсутствует возможность удалять столбцы, входящие в первичный ключ или ключ для сэмплирования (в общем, входящие в выражение ENGINE
). Изменение типа у столбцов, входящих в первичный ключ возможно только в том случае, если это изменение не приводит к изменению данных (например, разрешено добавление значения в Enum или изменение типа с DateTime
на UInt32
).
Если возможностей запроса ALTER
не хватает для нужного изменения таблицы, вы можете создать новую таблицу, скопировать туда данные с помощью запроса INSERT SELECT, затем поменять таблицы местами с помощью запроса RENAME, и удалить старую таблицу. В качестве альтернативы для запроса INSERT SELECT
, можно использовать инструмент clickhouse-copier.
Запрос ALTER
блокирует все чтения и записи для таблицы. То есть, если на момент запроса ALTER
, выполнялся долгий SELECT
, то запрос ALTER
сначала дождётся его выполнения. И в это время, все новые запросы к той же таблице, будут ждать, пока завершится этот ALTER
.
Для таблиц, которые не хранят данные самостоятельно (типа Merge и Distributed), ALTER
всего лишь меняет структуру таблицы, но не меняет структуру подчинённых таблиц. Для примера, при ALTER-е таблицы типа Distributed
, вам также потребуется выполнить запрос ALTER
для таблиц на всех удалённых серверах.