INSERT INTO Statement
Вставляет данные в таблицу.
Синтаксис
Вы можете указать список колонок для вставки, используя (c1, c2, c3)
. Вы также можете использовать выражение с колонкой matcher, такое как *
и/или модификаторы, такие как 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 должен быть установлен в клаузуле 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
строки.
См. Также