ON CLUSTER, que é descrita separadamente.
Formas de sintaxe
Criar uma tabela com um esquema explícito
table_name no banco de dados db ou no banco de dados atual, se db não estiver definido, com a estrutura especificada entre colchetes e o engine especificado.
A estrutura da tabela é uma lista de descrições de colunas, índices secundários, projeções e restrições. Se a chave primária for compatível com o engine, ela será indicada como parâmetro do motor de tabela.
Uma descrição de coluna é name type no caso mais simples. Exemplo: RegionID UInt32.
Os modificadores que seguem o tipo — COMMENT, compression_codec, STATISTICS, TTL, COLLATE, PRIMARY KEY e SETTINGS por coluna — podem ser escritos em qualquer ordem, e cada um deles pode aparecer no máximo uma vez. Por exemplo, RegionID UInt32 CODEC(ZSTD) COMMENT 'comment for column' e RegionID UInt32 COMMENT 'comment for column' CODEC(ZSTD) são equivalentes. Observe que SHOW CREATE TABLE normaliza a declaração de coluna: os modificadores que permanecem nela são sempre impressos na ordem canônica COMMENT, CODEC, STATISTICS, TTL, COLLATE, SETTINGS, enquanto uma PRIMARY KEY por coluna é movida da declaração de coluna para a cláusula PRIMARY KEY no nível da tabela.
Expressões também podem ser definidas para valores padrão (veja abaixo).
Se necessário, a chave primária pode ser especificada com uma ou mais expressões-chave.
Comentários podem ser adicionados às colunas e à tabela.
Criar uma tabela com o esquema de uma tabela existente
Crie uma tabela com o esquema e os dados de tabelas existentes
db.table são anexadas a ela. Em outras palavras, os dados de db.table são clonados para db2.table_clone no momento da criação. Esta consulta é equivalente à seguinte:
db.table).
Criar uma tabela com uma função de tabela
Criar uma tabela com uma consulta SELECT
SELECT, com o motor engine, e a preenche com os dados de SELECT. Você também pode especificar explicitamente a definição das colunas.
Se a tabela já existir e IF NOT EXISTS for especificado, a consulta não fará nada.
Pode haver outras cláusulas após a cláusula ENGINE na consulta. Veja a documentação detalhada sobre como criar tabelas nas descrições de motores de tabela.
Exemplo
Query
Response
Especificar valores padrão de colunas
DEFAULT expr, MATERIALIZED expr ou ALIAS expr. Exemplo: URLDomain String DEFAULT domain(URL).
A expressão expr é opcional. Se for omitida, o tipo da coluna deve ser especificado explicitamente, e o valor padrão será 0 para colunas numéricas, '' (a string vazia) para colunas de string, [] (o array vazio) para colunas de array, 1970-01-01 para colunas de data ou NULL para colunas Nullable.
O tipo da coluna com valor padrão pode ser omitido; nesse caso, ele é inferido a partir do tipo de expr. Por exemplo, o tipo da coluna EventDate DEFAULT toDate(EventTime) será date.
Se um tipo de dado e uma expressão de valor padrão forem especificados, será inserida uma função implícita de conversão de tipo que converte a expressão para o tipo especificado. Exemplo: Hits UInt32 DEFAULT 0 é representado internamente como Hits UInt32 DEFAULT toUInt32(0).
Uma expressão de valor padrão expr pode referenciar colunas arbitrárias da tabela e constantes. O ClickHouse verifica se alterações na estrutura da tabela não introduzem loops no cálculo da expressão. Para INSERT, ele verifica se as expressões podem ser resolvidas — isto é, se todas as colunas a partir das quais elas podem ser calculadas foram fornecidas.
DEFAULT
DEFAULT expr
Valor padrão comum. Se o valor dessa coluna não for especificado em uma consulta INSERT, ele será calculado com base em expr.
Exemplo:
MATERIALIZED
MATERIALIZED expr
Expressão materializada. Os valores dessas colunas são calculados automaticamente de acordo com a expressão materializada especificada quando as linhas são inseridas. Não é possível especificar explicitamente esses valores durante INSERTs.
Além disso, colunas com valor padrão desse tipo não são incluídas no resultado de SELECT *. Isso preserva a invariante de que o resultado de um SELECT * sempre pode ser inserido de volta na tabela usando INSERT. Esse comportamento pode ser desativado com a configuração asterisk_include_materialized_columns.
Exemplo:
EPHEMERAL
EPHEMERAL [expr]
Coluna efêmera. Colunas desse tipo não são armazenadas na tabela e não é possível consultá-las com SELECT. O único propósito das colunas efêmeras é servir de base para expressões de valor padrão de outras colunas.
Um insert sem colunas explicitamente especificadas ignorará colunas desse tipo. Isso preserva a invariante de que o resultado de um SELECT * sempre pode ser inserido de volta na tabela usando INSERT.
Exemplo:
ALIAS
ALIAS expr
Colunas calculadas (sinônimo). Colunas desse tipo não são armazenadas na tabela, e não é possível fazer INSERT de valores nelas.
Quando consultas SELECT fazem referência explícita a colunas desse tipo, o valor é calculado no momento da consulta a partir de expr. Por padrão, SELECT * exclui colunas ALIAS. Esse comportamento pode ser desativado com a configuração asterisk_include_alias_columns.
Ao usar a consulta ALTER para adicionar novas colunas, os dados antigos dessas colunas não são gravados. Em vez disso, ao ler dados antigos que não têm valores para as novas colunas, as expressões são calculadas dinamicamente por padrão. No entanto, se a execução dessas expressões exigir colunas diferentes que não estejam indicadas na consulta, essas colunas também serão lidas, mas apenas para os blocos de dados que precisarem disso.
Se você adicionar uma nova coluna a uma tabela, mas depois alterar sua expressão padrão, os valores usados para os dados antigos mudarão (para dados cujos valores não foram armazenados em disco). Observe que, ao executar mesclagens em segundo plano, os dados das colunas que estiverem ausentes em uma das partes que estão sendo mescladas serão gravados na parte mesclada.
Não é possível definir valores padrão para elementos em estruturas de dados aninhadas.
Modificadores NULL ou NOT NULL
NULL e NOT NULL, quando usados após o tipo de dado na definição da coluna, indicam se ela pode ou não ser Nullable.
Se o tipo não for Nullable e NULL for especificado, ele será tratado como Nullable; se NOT NULL for especificado, não será. Por exemplo, INT NULL é o mesmo que Nullable(INT). Se o tipo for Nullable e os modificadores NULL ou NOT NULL forem especificados, uma exceção será gerada.
Veja também a configuração data_type_default_nullable.
Você pode definir uma chave primária ao criar uma tabela. A chave primária pode ser especificada de duas formas:
Na lista de colunas
Fora da lista de colunas
Especificar restrições de tabela
CONSTRAINT
boolean_expr_1 pode ser qualquer expressão booleana. Se forem definidas restrições para a tabela, cada uma delas será verificada para cada linha na consulta INSERT. Se alguma restrição não for atendida — o servidor gerará uma exceção com o nome da restrição e a expressão de verificação.
Adicionar um grande número de restrições pode afetar negativamente o desempenho de consultas INSERT grandes.
As restrições existentes em todas as tabelas podem ser inspecionadas por meio da tabela system.constraints.
ASSUME
ASSUME é usada para definir uma CONSTRAINT em uma tabela que se presume ser true. Essa restrição pode então ser usada pelo otimizador para melhorar o desempenho das consultas SQL.
Veja este exemplo em que ASSUME CONSTRAINT é usado na criação da tabela users_a:
ASSUME CONSTRAINT é usado para declarar que a função length(name) é sempre igual ao valor da coluna name_len. Isso significa que, sempre que length(name) for chamada em uma consulta, o ClickHouse poderá substituí-la por name_len, o que tende a ser mais rápido, pois evita chamar a função length().
Assim, ao executar a consulta SELECT name FROM users_a WHERE length(name) < 5;, o ClickHouse pode otimizá-la para SELECT name FROM users_a WHERE name_len < 5; por causa de ASSUME CONSTRAINT. Isso pode fazer com que a consulta seja executada mais rapidamente, pois evita calcular o comprimento de name para cada linha.
ASSUME CONSTRAINT não impõe a restrição; ele apenas informa ao otimizador que a restrição é válida. Se a restrição não for realmente válida, os resultados das consultas poderão estar incorretos. Portanto, você só deve usar ASSUME CONSTRAINT se tiver certeza de que a restrição é válida.
Defina o tempo de armazenamento com TTL
Selecionar codecs de compressão para colunas
lz4 na versão autogerenciada e zstd no ClickHouse Cloud. Também é possível definir o método de compressão de cada coluna na consulta CREATE TABLE:
Criar tabelas temporárias
Atualize uma tabela atomicamente com REPLACE TABLE
REPLACE permite atualizar uma tabela atomicamente. Para obter detalhes, consulte REPLACE TABLE.
Adicionar um comentário à tabela
A cláusula
COMMENT deve ser especificada depois de quaisquer cláusulas específicas de armazenamento, como PARTITION BY, ORDER BY e SETTINGS específicos de armazenamento.Após a cláusula COMMENT, apenas SETTINGS específicos da consulta (como max_threads etc.) serão interpretados, e não as configurações relacionadas ao armazenamento.Isso significa que a ordem correta das cláusulas é:ENGINE- cláusulas de armazenamento
COMMENT- configurações da consulta (se houver)
Query
Response