Перейти к основному содержимому
Перейти к основному содержимому

insert-into

description: 'Документация для выражения INSERT INTO' sidebar_label: 'INSERT INTO' sidebar_position: 33 slug: /sql-reference/statements/insert-into title: 'Выражение INSERT INTO'

Вы можете указать список столбцов для вставки, используя (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 трактуется как данные. Например:

Ограничения

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

Вставка результатов 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

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

Результат:

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

Этот пример очень похож на предыдущий, но вставки выполняются из нескольких файлов с использованием FROM INFILE 'input_*.csv.

подсказка

В дополнение к выбору нескольких файлов с помощью *, вы можете использовать диапазоны ({1,2} или {1..9}) и другие замены глобусов. Все три будут работать с примером выше:

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

Данные могут быть вставлены в таблицы, на которые ссылаются табличные функции.

Синтаксис

Пример

Табличная функция remote используется в следующих запросах:

Результат:

Вставка в ClickHouse Cloud

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

После успешного выполнения INSERT данные записываются в базовое хранилище. Однако может пройти некоторое время, прежде чем реплики получат эти обновления. Поэтому, если вы используете другое соединение, которое выполняет запрос SELECT на одной из этих других реплик, обновленные данные могут еще не отображаться.

Вы можете использовать select_sequential_consistency, чтобы заставить реплику получить последние обновления. Вот пример запроса SELECT с использованием этой настройки:

Обратите внимание, что использование select_sequential_consistency увеличит нагрузку на ClickHouse Keeper (используемый в ClickHouse Cloud) и может привести к снижению производительности в зависимости от нагрузки на службу. Мы не рекомендуем включать эту настройку, если это не абсолютно необходимо. Рекомендуемый подход — выполнять чтения/записи в одной сессии или использовать клиентский драйвер, который использует нативный протокол (и, таким образом, поддерживает липкие соединения).

Вставка в реплицированной настройке

В реплицированной настройке данные будут видны на других репликах после их репликации. Данные начинают реплицироваться (загружаться на другие реплики) сразу после INSERT. Это отличается от ClickHouse Cloud, где данные немедленно записываются в общее хранилище, и реплики подписываются на изменения метаданных.

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

Учет производительности

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

  • Добавляйте данные относительно большими партиями, например, по 100 000 строк за один раз.
  • Группируйте данные по ключу раздела перед загрузкой их в ClickHouse.

Производительность не снизится, если:

  • Данные добавляются в реальном времени.
  • Вы загружаете данные, которые обычно отсортированы по времени.

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

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

Использование async_insert или Buffer движка таблиц приводит к дополнительному буферизованию.

Большие или долгосрочные вставки

При вставке больших объемов данных ClickHouse оптимизирует скорость записи через процесс, называемый "сжатием". Малые блоки вставленных данных в памяти объединяются и сжимаются в более крупные блоки перед записью на диск. Сжатие снижает накладные расходы, связанные с каждой операцией записи. На этом этапе вставленные данные будут доступны для запросов после завершения записи ClickHouse каждой max_insert_block_size строк.

См. также