ON CLUSTER, которое описано отдельно.
Синтаксические формы
Создание таблицы с явной схемой
table_name в базе данных db или в текущей базе данных, если db не задана, со структурой, указанной в скобках, и движком engine.
Структура таблицы представляет собой список описаний столбцов, вторичных индексов, проекций и ограничений. Если первичный ключ поддерживается движком, он указывается как параметр движка таблицы.
В простейшем случае описание столбца имеет вид name type. Пример: RegionID UInt32.
Модификаторы, следующие за типом, — COMMENT, compression_codec, STATISTICS, TTL, COLLATE, PRIMARY KEY и SETTINGS для каждого столбца — можно записывать в любом порядке, причём каждый из них не более одного раза. Например, RegionID UInt32 CODEC(ZSTD) COMMENT 'comment for column' и RegionID UInt32 COMMENT 'comment for column' CODEC(ZSTD) равнозначны. Обратите внимание, что SHOW CREATE TABLE нормализует объявление столбца: оставшиеся в нём модификаторы всегда выводятся в каноническом порядке COMMENT, CODEC, STATISTICS, TTL, COLLATE, SETTINGS, а PRIMARY KEY для отдельного столбца перемещается из объявления столбца в предложение PRIMARY KEY на уровне таблицы.
Для значений по умолчанию также можно задавать выражения (см. ниже).
При необходимости можно указать первичный ключ с одним или несколькими ключевыми выражениями.
Для столбцов и таблицы можно добавлять комментарии.
Создать таблицу со схемой существующей таблицы
Создать таблицу со схемой и данными существующей таблицы
db.table. Иными словами, при создании данные из db.table клонируются в db2.table_clone. Этот запрос эквивалентен следующему:
db.table).
Создание таблицы с помощью табличной функции
Создание таблицы с помощью SELECT-запроса
SELECT, с движком engine и заполняет её данными из SELECT. Также можно явно указать описание столбцов.
Если таблица уже существует и указано IF NOT EXISTS, запрос не выполнит никаких действий.
В запросе после предложения ENGINE могут следовать и другие предложения. Подробную документацию о том, как создавать таблицы, см. в описаниях движков таблиц.
Пример
Query
Response
Указание значений по умолчанию
DEFAULT expr, MATERIALIZED expr или ALIAS expr. Пример: URLDomain String DEFAULT domain(URL).
Выражение expr необязательно. Если оно опущено, тип столбца должен быть указан явно, а значением по умолчанию будет 0 для числовых столбцов, '' (пустая строка) для строковых столбцов, [] (пустой массив) для столбцов типа Array, 1970-01-01 для столбцов с типом Date или NULL для столбцов с типом Nullable.
Тип столбца со значением по умолчанию можно не указывать — в этом случае он выводится из типа expr. Например, тип столбца EventDate DEFAULT toDate(EventTime) будет Date.
Если указаны и тип данных, и выражение значения по умолчанию, неявно добавляется функция приведения типов, которая преобразует выражение к указанному типу. Пример: Hits UInt32 DEFAULT 0 внутри представляется как Hits UInt32 DEFAULT toUInt32(0).
Выражение значения по умолчанию expr может ссылаться на произвольные столбцы таблицы и константы. ClickHouse проверяет, что изменения структуры таблицы не приводят к появлению циклов при вычислении выражений. Для INSERT также проверяется, что выражения могут быть вычислены, то есть что переданы все столбцы, на основе которых их можно вычислить.
DEFAULT
DEFAULT expr
Обычное значение по умолчанию. Если значение такого столбца не указано в запросе INSERT, оно вычисляется на основе expr.
Пример:
MATERIALIZED
MATERIALIZED expr
Материализованное выражение. Значения таких столбцов автоматически вычисляются в соответствии с указанным материализованным выражением при вставке строк. Эти значения нельзя явно задавать в INSERT.
Кроме того, такие столбцы со значением по умолчанию не включаются в результат SELECT *. Это сделано для сохранения инварианта, согласно которому результат SELECT * всегда можно вставить обратно в таблицу с помощью INSERT. Это поведение можно отключить с помощью настройки asterisk_include_materialized_columns.
Пример:
EPHEMERAL
EPHEMERAL [expr]
Эфемерный столбец. Столбцы этого типа не хранятся в таблице, и их нельзя использовать в SELECT. Единственное назначение эфемерных столбцов — формировать на их основе выражения значений по умолчанию для других столбцов.
При вставке без явно указанных столбцов столбцы этого типа будут пропущены. Это нужно, чтобы сохранить инвариант: результат SELECT * всегда можно вставить обратно в таблицу с помощью INSERT.
Пример:
ALIAS
ALIAS expr
Вычисляемые столбцы (синоним). Столбцы этого типа не хранятся в таблице, и в них нельзя вставлять значения.
Когда запросы SELECT явно обращаются к столбцам этого типа, значение вычисляется во время выполнения запроса из expr. По умолчанию SELECT * исключает столбцы ALIAS. Это поведение можно отключить с помощью настройки asterisk_include_alias_columns.
При использовании запроса ALTER для добавления новых столбцов старые данные для этих столбцов не записываются. Вместо этого при чтении старых данных, в которых нет значений для новых столбцов, выражения по умолчанию вычисляются на лету. Однако если для вычисления выражений требуются другие столбцы, не указанные в запросе, эти столбцы также будут прочитаны, но только для тех блоков данных, где это необходимо.
Если вы добавите новый столбец в таблицу, а затем измените его выражение по умолчанию, значения, используемые для старых данных, изменятся (для данных, значения которых не были сохранены на диске). Обратите внимание, что при выполнении фоновых слияний данные для столбцов, отсутствующих в одной из сливающихся частей, записываются в слитую часть.
Невозможно задать значения по умолчанию для элементов во вложенных структурах данных.
Модификаторы NULL и NOT NULL
NULL и NOT NULL, указанные после типа данных в определении столбца, соответственно разрешают или запрещают делать его Nullable.
Если тип не Nullable и указан NULL, он будет трактоваться как Nullable; если указан NOT NULL, то нет. Например, INT NULL — то же самое, что Nullable(INT). Если тип — Nullable и указаны модификаторы NULL или NOT NULL, будет сгенерировано исключение.
См. также настройку data_type_default_nullable.
При создании таблицы можно определить первичный ключ. Первичный ключ можно задать двумя способами:
В списке столбцов
Вне списка столбцов
Задание ограничений таблицы
CONSTRAINT
boolean_expr_1 может быть любым логическим выражением. Если для таблицы заданы ограничения, каждое из них будет проверяться для каждой строки в запросе INSERT. Если какое-либо ограничение нарушено, сервер сгенерирует исключение с именем ограничения и выражением проверки.
Добавление большого количества ограничений может негативно сказаться на производительности крупных запросов INSERT.
Существующие ограничения для всех таблиц можно просмотреть в таблице system.constraints.
ASSUME
ASSUME используется для задания CONSTRAINT для таблицы, которое считается истинным. Затем это ограничение может использоваться оптимизатором для повышения производительности SQL-запросов.
Рассмотрим пример, в котором ASSUME CONSTRAINT используется при создании таблицы users_a:
ASSUME CONSTRAINT используется, чтобы указать, что функция length(name) всегда равна значению столбца name_len. Это означает, что всякий раз, когда в запросе вызывается length(name), ClickHouse может заменить её на name_len, что должно работать быстрее, поскольку не требует вызова функции length().
Затем, при выполнении запроса SELECT name FROM users_a WHERE length(name) < 5;, ClickHouse может оптимизировать его до SELECT name FROM users_a WHERE name_len < 5; благодаря ASSUME CONSTRAINT. Это может ускорить выполнение запроса, поскольку не нужно вычислять длину name для каждой строки.
ASSUME CONSTRAINT не обеспечивает соблюдение ограничения, а лишь сообщает оптимизатору, что ограничение выполняется. Если ограничение на самом деле не выполняется, результаты запросов могут быть некорректными. Поэтому использовать ASSUME CONSTRAINT следует только в том случае, если вы уверены, что ограничение действительно выполняется.
Укажите срок хранения с TTL
Выбор кодеков сжатия для столбцов
lz4, а в ClickHouse Cloud — zstd. Также можно задать метод сжатия для каждого отдельного столбца в запросе CREATE TABLE:
Создание временных таблиц
Атомарное обновление таблицы с помощью REPLACE TABLE
REPLACE позволяет атомарно обновить таблицу атомарно. Подробнее см. в разделе REPLACE TABLE.
Добавление комментария к таблице
Предложение
COMMENT должно быть указано после всех предложений, относящихся к хранилищу, таких как PARTITION BY, ORDER BY и SETTINGS, специфичных для хранилища.После предложения COMMENT будут разбираться только SETTINGS, относящиеся к запросу (например, max_threads и т. д.), а не настройки, связанные с хранилищем.Это означает, что правильный порядок предложений такой:ENGINE- предложения хранилища
COMMENT- настройки запроса (если есть)
Query
Response