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 existenteAS <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 |
|
|
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. |
|
|
Se já existir uma tabela com o mesmo nome, a criação é ignorada silenciosamente. |
|
|
Nome da tabela ou view de origem. Views são compatíveis com o Hologres V2.1.21 e versões posteriores. |
|
|
Uma instrução SELECT. Para detalhes de sintaxe, consulte SELECT. |
|
|
Controla se os dados de origem são copiados. |
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 |
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 |
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 ASnã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;