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