(c1, c2, c3). Também é possível usar uma expressão com matcher de colunas, como *, e/ou modificadores, como APPLY, EXCEPT, REPLACE.
Por exemplo, considere a tabela:
b, pode fazer isso usando a palavra-chave EXCEPT. Com base na sintaxe acima, será necessário garantir que você insira tantos valores (VALUES (v11, v13)) quantas colunas especificar ((c1, c3)) :
a e c preenchidas com os valores informados, e b preenchida com o valor padrão. Também é possível usar a palavra-chave DEFAULT para inserir valores padrão:
- Os valores calculados a partir das expressões
DEFAULTespecificadas na definição da tabela. - Zeros e strings vazias, se as expressões
DEFAULTnão estiverem definidas.
INSERT ... VALUES:
Se quiser especificar
SETTINGS para a consulta INSERT, faça isso antes da cláusula FORMAT, pois tudo após FORMAT format_name é tratado como dados. Por exemplo:Restrições
Validação de tipos de dados
enable_time_time64_type, allow_suspicious_low_cardinality_types, allow_suspicious_fixed_string_types etc.) apenas durante a criação da tabela (CREATE TABLE) e a modificação do esquema (ALTER TABLE), não durante o INSERT.
Isso significa que, se já existir uma tabela com um tipo de dado não permitido, ainda será possível inserir dados nela mesmo quando a configuração correspondente estiver desabilitada no servidor. Isso é intencional — depois que uma tabela é criada, inserções não devem ser bloqueadas por configurações que controlam a criação de tipos.
Por exemplo:
Como consequência, um cliente com uma versão mais recente (na qual uma configuração vem habilitada por padrão) pode inserir dados com tipos de dados não permitidos em um servidor com uma versão mais antiga (na qual a configuração está desabilitada), desde que a tabela de destino já tenha os tipos de coluna correspondentes. A validação é imposta no nível de DDL, não no nível de DML.
Inserindo os resultados de SELECT
SELECT. No entanto, os nomes delas na expressão SELECT e na tabela de INSERT podem ser diferentes. Se necessário, é feita a conversão de tipo.
Nenhum dos formatos de dados, exceto o formato Values, permite atribuir valores a expressões como now(), 1 + 2 e assim por diante. O formato Values permite o uso limitado de expressões, mas isso não é recomendado, porque, nesse caso, é usado um código ineficiente para executá-las.
Outras consultas para modificar partes de dados não são compatíveis: UPDATE, DELETE, REPLACE, MERGE, UPSERT, INSERT UPDATE.
No entanto, você pode excluir dados antigos usando ALTER TABLE ... DROP PARTITION.
A cláusula FORMAT deve ser especificada no final da consulta se a cláusula SELECT contiver a função de tabela input().
Para inserir um valor padrão em vez de NULL em uma coluna com um tipo de dado não anulável, habilite a configuração insert_null_as_default.
INSERT também oferece suporte a CTE (expressão de tabela comum). Por exemplo, as duas instruções a seguir são equivalentes:
Inserção de dados a partir de um arquivo
file_name e type são literais de string. O formato do arquivo de entrada deve ser definido na cláusula FORMAT.
Há suporte a arquivos comprimidos. O tipo de compressão é detectado pela extensão do nome do arquivo. Também pode ser especificado explicitamente em uma cláusula COMPRESSION. Os tipos com suporte são: 'none', 'gzip', 'deflate', 'br', 'xz', 'zstd', 'lz4', 'bz2'.
Essa funcionalidade está disponível no cliente de linha de comando e no clickhouse-local.
Exemplos
Um único arquivo com FROM INFILE
Query
Response
Vários arquivos com FROM INFILE usando globs
FROM INFILE 'input_*.csv.
Inserindo usando uma função de tabela
Query
Response
Inserção no ClickHouse Cloud
INSERT ser concluído com sucesso, os dados são gravados no armazenamento subjacente. No entanto, as réplicas podem levar algum tempo para receber essas atualizações. Portanto, se você usar outra conexão para executar uma consulta SELECT em uma dessas outras réplicas, os dados atualizados talvez ainda não apareçam.
É possível usar select_sequential_consistency para forçar a réplica a receber as atualizações mais recentes. Veja um exemplo de consulta SELECT usando essa configuração:
select_sequential_consistency aumentará a carga no ClickHouse Keeper (usado internamente pelo ClickHouse Cloud) e poderá resultar em um desempenho mais lento, dependendo da carga no serviço. Recomendamos não ativar essa configuração, a menos que seja necessário. A abordagem recomendada é executar leituras/gravações na mesma sessão ou usar um driver de cliente que utilize o protocolo nativo (e, assim, ofereça suporte a sticky connections).
Inserção em uma configuração replicada
INSERT. Isso difere do ClickHouse Cloud, em que os dados são gravados imediatamente no armazenamento compartilhado e as réplicas acompanham as alterações de metadados.
Observe que, em configurações replicadas, inserções às vezes podem levar um tempo considerável (na ordem de um segundo), pois isso exige um commit no ClickHouse Keeper para o consenso distribuído. O uso de S3 para armazenamento também acrescenta latência.
Considerações de desempenho
INSERT ordena os dados de entrada pela chave primária e os divide em partições com base na chave de partição. Se você inserir dados em várias partições de uma só vez, isso pode reduzir significativamente o desempenho da consulta INSERT. Para evitar isso:
- Adicione os dados em lotes relativamente grandes, como 100.000 linhas por vez.
- Agrupe os dados pela chave de partição antes de enviá-los ao ClickHouse.
- Os dados forem adicionados em tempo real.
- Você enviar dados que normalmente já estejam ordenados por tempo.
Inserções assíncronas
async_insert.
Usar async_insert ou o motor de tabela Buffer resulta em bufferização adicional.
Inserções grandes ou demoradas
max_insert_block_size linhas.
Veja também