Перейти к основному содержанию
Вставляет данные в таблицу. Синтаксис
Вы можете указать список столбцов для вставки с помощью (c1, c2, c3). Также можно использовать выражение с селектором столбцов, например *, и/или модификаторы, такие как APPLY, EXCEPT, REPLACE. Например, рассмотрим таблицу:
Если вы хотите вставить данные во все столбцы, кроме столбца b, это можно сделать с помощью ключевого слова EXCEPT. В соответствии с приведённым выше синтаксисом нужно убедиться, что число вставляемых значений (VALUES (v11, v13)) совпадает с числом указанных столбцов ((c1, c3)) :
В этом примере видно, что во второй вставленной строке столбцы a и c заполнены переданными значениями, а b — значением по умолчанию. Также можно использовать ключевое слово DEFAULT, чтобы вставить значения по умолчанию:
Если список столбцов не включает все существующие столбцы, остальные заполняются:
  • Значениями, вычисленными из выражений DEFAULT, указанных в определении таблицы.
  • Нулями и пустыми строками, если выражения DEFAULT не заданы.
Данные можно передавать в INSERT в любом формате, поддерживаемом ClickHouse. Формат должен быть явно указан в запросе:
Например, следующий формат запроса совпадает с базовой версией INSERT ... VALUES:
ClickHouse удаляет все пробелы и один символ перевода строки (если он есть) перед данными. При формировании запроса мы рекомендуем размещать данные с новой строки после операторов запроса, что особенно важно, если данные начинаются с пробелов. Пример:
Вы можете выполнять вставку данных отдельно от запроса с помощью клиента командной строки или HTTP-интерфейса.
Если вы хотите указать SETTINGS для запроса INSERT, это нужно сделать до предложения FORMAT, поскольку всё, что идёт после FORMAT format_name, рассматривается как данные. Например:

Ограничения

Если у таблицы есть ограничения, их выражения будут проверяться для каждой вставляемой строки данных. Если какое-либо из этих ограничений не выполняется, сервер выдаст исключение с именем ограничения и его выражением, а запрос будет остановлен.

Проверка типов данных

ClickHouse проверяет допустимые типы данных (которые контролируются настройками вроде enable_time_time64_type, allow_suspicious_low_cardinality_types, allow_suspicious_fixed_string_types и т. д.) только при создании таблицы (CREATE TABLE) и изменении схемы (ALTER TABLE), но не при INSERT. Это означает, что если таблица с недопустимым типом данных уже существует, в нее можно вставлять данные, даже если соответствующая настройка отключена на сервере. Это сделано намеренно: после создания таблицы вставка не должна блокироваться настройками, управляющими созданием типов. Например:
В результате клиент с более новой версией (где параметр по умолчанию включен) может выполнять вставку данных с недопустимыми типами данных на сервер с более старой версией (где параметр отключен), если в целевой таблице уже есть столбцы соответствующих типов. Проверка выполняется на уровне DDL, а не DML.

Вставка результатов запроса SELECT

Синтаксис
Столбцы сопоставляются в соответствии с их позицией в предложении SELECT. Однако их имена в выражении SELECT и в таблице для INSERT могут различаться. При необходимости выполняется приведение типов. Ни один из форматов данных, кроме формата Values, не позволяет задавать значения в виде выражений, таких как now(), 1 + 2 и т. д. Формат Values допускает ограниченное использование выражений, но это не рекомендуется, поскольку в этом случае для их вычисления используется неэффективный код. Другие запросы на изменение частей данных не поддерживаются: UPDATE, DELETE, REPLACE, MERGE, UPSERT, INSERT UPDATE. Однако старые данные можно удалить с помощью ALTER TABLE ... DROP PARTITION. Предложение FORMAT должно быть указано в конце запроса, если предложение SELECT содержит табличную функцию input(). Чтобы вставить значение по умолчанию вместо NULL в столбец с типом данных, не допускающим NULL, включите настройку insert_null_as_default. INSERT также поддерживает CTE (общее табличное выражение). Например, следующие два оператора эквивалентны:

Вставка данных из файла

Синтаксис
Используйте приведённый выше синтаксис для вставки данных из файла или файлов, хранящихся на стороне клиента. file_name и type — строковые литералы. Входной формат файла должен быть задан в предложении FORMAT. Поддерживаются сжатые файлы. Тип сжатия определяется по расширению имени файла. Либо его можно явно указать в предложении COMPRESSION. Поддерживаются следующие типы: 'none', 'gzip', 'deflate', 'br', 'xz', 'zstd', 'lz4', 'bz2'. Эта возможность доступна в клиенте командной строки и clickhouse-local. Примеры

Один файл с использованием FROM INFILE

Выполните следующие запросы с помощью клиента командной строки:
Query
Response

Несколько файлов в FROM INFILE с использованием глоб-шаблонов

Этот пример очень похож на предыдущий, но здесь вставка выполняется из нескольких файлов с помощью FROM INFILE 'input_*.csv.
Помимо выбора нескольких файлов с помощью *, можно использовать диапазоны ({1,2} или {1..9}) и другие подстановки глоб-шаблонов. Все три варианта будут работать с примером выше:

Вставка с помощью табличной функции

Данные можно вставлять в таблицы, указанные через табличные функции. Синтаксис
Пример Табличная функция remote используется в следующих запросах:
Query
Response

Вставка в ClickHouse Cloud

По умолчанию сервисы в ClickHouse Cloud предоставляют несколько реплик для высокой доступности. При подключении к сервису соединение устанавливается с одной из этих реплик. После успешного выполнения INSERT данные записываются в нижележащее хранилище. Однако репликам может потребоваться некоторое время, чтобы получить эти обновления. Поэтому, если вы используете другое соединение, которое выполняет запрос SELECT к одной из остальных реплик, обновлённые данные могут там ещё не отображаться. Можно использовать select_sequential_consistency, чтобы принудительно синхронизировать реплику с последними обновлениями. Вот пример запроса SELECT с этой настройкой:
Обратите внимание, что использование select_sequential_consistency увеличивает нагрузку на ClickHouse Keeper (который ClickHouse Cloud использует внутри своей инфраструктуры) и, в зависимости от нагрузки на сервис, может приводить к снижению производительности. Мы не рекомендуем включать этот параметр без необходимости. Рекомендуемый подход — выполнять операции чтения и записи в рамках одного сеанса или использовать клиентский драйвер, работающий через собственный протокол (и, следовательно, поддерживающий sticky connections).

Вставка в реплицируемой конфигурации

В реплицируемой конфигурации данные становятся видны на других репликах после репликации. Репликация данных (то есть их загрузка на другие реплики) начинается сразу после INSERT. Это отличается от ClickHouse Cloud, где данные сразу записываются в общее хранилище, а реплики отслеживают изменения метаданных. Обратите внимание: в реплицируемых конфигурациях операции INSERT иногда могут занимать заметное время (порядка одной секунды), поскольку для этого требуется фиксация в ClickHouse Keeper для достижения распределённого консенсуса. Использование S3 в качестве хранилища также увеличивает задержку.

Рекомендации по производительности

INSERT сортирует входные данные по первичному ключу и разбивает их на партиции по ключу партиционирования. Если вставлять данные сразу в несколько партиций, это может значительно снизить производительность запроса INSERT. Чтобы этого избежать:
  • Добавляйте данные достаточно крупными батчами, например по 100 000 строк за раз.
  • Группируйте данные по ключу партиционирования перед загрузкой в ClickHouse.
Производительность не снизится, если:
  • Данные добавляются в реальном времени.
  • Вы загружаете данные, которые обычно уже отсортированы по времени.

Асинхронные вставки

Можно асинхронно вставлять данные небольшими, но частыми порциями. Данные из таких вставок объединяются в батчи, а затем безопасно вставляются в таблицу. Чтобы использовать асинхронные вставки, включите настройку async_insert. Использование async_insert или Buffer движка таблицы приводит к дополнительной буферизации.

Крупные или длительные вставки

При вставке больших объёмов данных ClickHouse оптимизирует производительность записи с помощью процесса, называемого «squashing». Небольшие блоки вставляемых данных в памяти сливаются и объединяются в более крупные блоки перед записью на диск. Squashing уменьшает накладные расходы, связанные с каждой операцией записи. В ходе этого процесса данные становятся доступными для запросов после того, как ClickHouse завершит запись каждых max_insert_block_size строк. См. также
Последнее изменение 2 июля 2026 г.