Todos os produtos
Search
Central de documentação

Hologres:CREATE TABLE AS

Última atualização: Sep 18, 2026

CREATE TABLE AS cria uma nova tabela a partir de uma tabela existente ou do resultado de uma consulta SELECT, copiando opcionalmente os dados ao mesmo tempo.

Há suporte para duas variantes de sintaxe:

  • AS TABLE <src_table_name> — copia o schema e, opcionalmente, os dados de uma tabela ou view existente

  • AS <select_query> — cria uma tabela a partir do conjunto de resultados de uma consulta SELECT

CREATE TABLE AS copia os schemas de coluna e os tipos de dados, mas não copia propriedades da tabela, como chaves primárias, restrições de nulabilidade, índices ou valores padrão.

Pré-requisitos

Antes de começar, verifique se você tem:

  • Uma instância do Hologres na versão V1.3.21 ou posterior

  • Uma tabela ou view de origem existente para copiar

Sintaxe

-- Variant 1: Copy from a source table or view
CREATE TABLE [ IF NOT EXISTS ] <new_table_name> AS TABLE <src_table_name> [ WITH [ NO ] DATA ]

-- Variant 2: Create from a SELECT query result
CREATE TABLE [ IF NOT EXISTS ] <new_table_name> AS <select_query> [ WITH [ NO ] DATA ]

Parâmetros

Parâmetro

Descrição

new_table_name

Nome da nova tabela. Deve ser uma string fixa — não uma variável ou chamada de função. Tabelas externas não podem ser criadas com esta instrução.

IF NOT EXISTS

Se já existir uma tabela com o mesmo nome, a criação é ignorada silenciosamente.

src_table_name

Nome da tabela ou view de origem. Views são compatíveis com o Hologres V2.1.21 e versões posteriores.

select_query

Uma instrução SELECT. Para detalhes de sintaxe, consulte SELECT.

WITH [ NO ] DATA

Controla se os dados de origem são copiados. WITH DATA (padrão) copia os dados. WITH NO DATA cria uma tabela vazia com o mesmo schema.

O que é e o que não é copiado

CREATE TABLE AS copia os nomes de coluna e os tipos de dados, mas não copia as propriedades da tabela.

CREATE TABLE AS

CREATE TABLE LIKE

Schemas de coluna e tipos de dados

Copiados

Copiados

Propriedades da tabela (nulabilidade, valores padrão, índices, chaves primárias, comentários)

Não copiadas

Parcialmente copiadas

Dados da tabela de origem

Copiados (com WITH DATA)

Não copiados

Configuração manual de propriedades (índices, chaves de distribuição)

Suporte limitado. Chaves primárias não podem ser configuradas manualmente.

Suporte limitado. Chaves primárias não podem ser configuradas manualmente.

Tabela não particionada a partir de uma tabela particionada

Compatível

Compatível

Criação de tabela particionada

Não compatível

Parcialmente compatível (via partition_clause)

Para mais detalhes sobre CREATE TABLE LIKE, consulte CREATE TABLE LIKE.

Limitações

  • Somente o Hologres V1.3.21 e versões posteriores são compatíveis com CREATE TABLE AS. Para atualizar uma instância mais antiga, faça o upgrade manualmente no console do Hologres ou entre em um grupo DingTalk do Hologres para solicitar a atualização. Para mais detalhes, consulte Instance upgrades ou Como obter suporte online?.

  • A atomicidade da importação de dados não é garantida ao usar WITH DATA.

  • Para colunas com tipos que exigem precisão — VARCHAR, BPCHAR, NUMERIC (DECIMAL), BIT ou VARBIT — especifique explicitamente a precisão na instrução CREATE TABLE AS. Omitir a precisão causa um erro.

  • Para colunas do tipo INTERVAL, TIME, TIMETZ, TIMESTAMP ou TIMESTAMPTZ, não especifique precisão. Especificar precisão para esses tipos causa um erro.

  • CREATE TABLE AS não cria tabelas particionadas; sempre gera uma tabela não particionada. Ao copiar de uma tabela pai particionada, a instrução inclui automaticamente os dados de todas as tabelas filhas.

  • No Hologres V3.0.9 e versões posteriores, é possível usar recursos de computação serverless para executar CREATE TABLE AS. Para mais detalhes, consulte Work with serverless computing.

Comportamento do log de consultas

A partir do Hologres V3.0.9, CREATE TABLE AS gera dois registros em hologres.hg_query_log: um para a própria instrução CREATE TABLE AS e outro para a instrução interna INSERT usada para copiar os dados. Os dois registros são vinculados por um ID de transação.

Para recuperar ambos os registros de uma determinada execução:

SELECT
    query_id,
    query,
    extended_info
FROM
    hologres.hg_query_log
WHERE
    extended_info ->> 'source_trx' = '<transaction_id>'
ORDER BY
    query_start;

Substitua <transaction_id> pelo valor do campo trans_id do registro de log do CREATE TABLE AS.

Nas versões anteriores à V3.0.9, apenas um registro é gerado (referente à instrução CREATE TABLE AS).

Exemplos

Copiar uma tabela não particionada

Os exemplos a seguir utilizam esta tabela de origem:

BEGIN;
CREATE TABLE public.src_table (
    "a" int8 NOT NULL,
    "b" text NOT NULL,
    PRIMARY KEY (a)
);
CALL SET_TABLE_PROPERTY('public.src_table', 'orientation', 'column');
CALL SET_TABLE_PROPERTY('public.src_table', 'bitmap_columns', 'b');
CALL SET_TABLE_PROPERTY('public.src_table', 'dictionary_encoding_columns', 'b:auto');
CALL SET_TABLE_PROPERTY('public.src_table', 'time_to_live_in_seconds', '3153600000');
CALL SET_TABLE_PROPERTY('public.src_table', 'distribution_key', 'a');
CALL SET_TABLE_PROPERTY('public.src_table', 'storage_format', 'segment');
COMMIT;

INSERT INTO public.src_table VALUES (1, 'qaz'), (2, 'wsx');

Copiar com dados (padrão)

CREATE TABLE public.new_table AS TABLE public.src_table;

Consulte a nova tabela:

SELECT * FROM public.new_table;
 a |  b
---+-----
 1 | qaz
 2 | wsx

A nova tabela contém os mesmos dados, mas não herda a chave primária nem a restrição NOT NULL da tabela de origem:

SELECT hg_dump_script('public.new_table');
BEGIN;
CREATE TABLE public.new_table (
    a int,   -- int8 NOT NULL in source; inherited as int (nullable) here
    b text   -- text NOT NULL in source; inherited as text (nullable) here
);
CALL set_table_property('public.new_table', 'orientation', 'column');
CALL set_table_property('public.new_table', 'storage_format', 'orc');
CALL set_table_property('public.new_table', 'bitmap_columns', 'b');
CALL set_table_property('public.new_table', 'dictionary_encoding_columns', 'b:auto');
CALL set_table_property('public.new_table', 'time_to_live_in_seconds', '3153600000');
COMMENT ON TABLE public.new_table IS NULL;
END;

Copiar apenas o schema (sem dados)

CREATE TABLE public.new_table AS TABLE public.src_table WITH NO DATA;

Ignorar se a tabela já existir

CREATE TABLE IF NOT EXISTS public.new_table AS TABLE public.src_table;

Se new_table já existir, a instrução não faz nada e retorna:

NOTICE: relation "new_table" already exists, skipping

Copiar a partir do resultado de uma consulta SELECT

CREATE TABLE public.new_table_2 AS SELECT * FROM public.src_table WHERE a = 1;

Copiar uma tabela particionada

Os exemplos a seguir utilizam esta tabela de origem particionada:

BEGIN;
CREATE TABLE public.src_table_partitioned (
    "a" int NOT NULL,
    "b" text,
    PRIMARY KEY (a)
) PARTITION BY LIST(a);

CREATE TABLE public.src_table_child1 PARTITION OF public.src_table_partitioned FOR VALUES IN (1);
CREATE TABLE public.src_table_child2 PARTITION OF public.src_table_partitioned FOR VALUES IN (2);
CREATE TABLE public.src_table_child3 PARTITION OF public.src_table_partitioned FOR VALUES IN (3);
COMMIT;

INSERT INTO src_table_child1 VALUES (1, 'aaa');
INSERT INTO src_table_child2 VALUES (2, 'bbb');
INSERT INTO src_table_child3 VALUES (3, 'ccc');

CREATE TABLE AS sempre cria uma tabela não particionada e não replica restrições de chave de partição nem relacionamentos de herança.

Copiar da tabela pai (inclui dados de todas as partições)

CREATE TABLE public.new_table_2 AS TABLE public.src_table_partitioned;
SELECT * FROM public.new_table_2;
 a |  b
---+-----
 2 | bbb
 1 | aaa
 3 | ccc

Copiar de uma única partição

CREATE TABLE public.new_table_3 AS TABLE public.src_table_child1;

Somente os dados de src_table_child1 são copiados.

Copiar de uma consulta SELECT e definir propriedades da tabela

Crie uma tabela a partir do resultado de uma consulta SELECT e configure suas propriedades na mesma transação:

-- Create the source table
BEGIN;
CREATE TABLE public.src_table (
    "a" int8 NOT NULL,
    "b" text NOT NULL,
    PRIMARY KEY (a)
);
CALL SET_TABLE_PROPERTY('public.src_table', 'orientation', 'column');
COMMIT;

-- Create a new table from the SELECT result and configure properties
BEGIN;
CREATE TABLE public.new_table AS SELECT * FROM public.src_table;
CALL SET_TABLE_PROPERTY('public.new_table', 'bitmap_columns', 'b');
CALL SET_TABLE_PROPERTY('public.new_table', 'dictionary_encoding_columns', 'b:auto');
CALL SET_TABLE_PROPERTY('public.new_table', 'time_to_live_in_seconds', '3153600');
CALL SET_TABLE_PROPERTY('public.new_table', 'distribution_key', 'a');
COMMIT;

Próximos passos