A instrução CREATE TABLE AS cria uma nova tabela a partir de uma tabela existente ou do resultado de uma consulta SELECT. Opcionalmente, ela também copia os dados no mesmo momento.
Duas variantes de sintaxe são suportadas:
AS TABLE <src_table_name>— copia o esquema e, opcionalmente, os dados de uma tabela ou visualize existenteAS <select_query>— cria uma tabela a partir do conjunto de resultados de uma consulta SELECT
A instrução CREATE TABLE AS copia esquemas de colunas e tipos de dados, mas não propriedades da tabela, como chaves primárias, restrições de nulidade, índices ou valores padrão.
Pré-requisitos
Antes de começar, verifique se você possui:
Uma instância do Hologres executando a versão V1.3.21 ou posterior
Uma tabela ou visualize de origem existente para servir como base da cópia
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 podendo ser uma variável ou chamada de função. Tabelas externas não podem ser criadas com esta instrução. |
|
|
Caso já exista uma tabela com o mesmo nome, ignora a criação silenciosamente. |
|
|
Nome da tabela ou visualize de origem. Visualize são suportadas no Hologres V2.1.21 e versões posteriores. |
|
|
Uma instrução SELECT. Para detalhes sobre a sintaxe, consulte SELECT. |
|
|
Controla se os dados de origem serão copiados. |
O que é e o que não é copiado
O comando CREATE TABLE AS replica nomes de colunas e tipos de dados, mas exclui as propriedades da tabela.
|
CREATE TABLE AS |
CREATE TABLE LIKE |
|
|
Esquemas de colunas e tipos de dados |
Copiados |
Copiados |
|
Propriedades da tabela (nulidade, valores padrão, índices, chaves primárias, comentários) |
Não copiados |
Parcialmente copiados |
|
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 |
Suportado |
Suportado |
|
Criação de tabela particionada |
Não suportado |
Parcialmente suportado (via |
Para obter detalhes sobre CREATE TABLE LIKE, consulte CREATE TABLE LIKE.
Limitações
Somente o Hologres V1.3.21 e versões posteriores suportam
CREATE TABLE AS. Para atualizar uma instância mais antiga, faça o upgrade manual pelo console do Hologres ou entre em um grupo do DingTalk do Hologres para solicitar a atualização. Para mais informações, veja Instance upgrades ou How to get online support?.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. A omissão da precisão resulta em erro.Em colunas dos tipos INTERVAL, TIME, TIMETZ, TIMESTAMP ou TIMESTAMPTZ, não defina precisão. Definir precisão para esses tipos causa erro.
O comando
CREATE TABLE ASnão cria tabelas particionadas, gerando sempre 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 utilizar recursos de computação serverless para executar
CREATE TABLE AS. Para detalhes, consulte Work with serverless computing.
Comportamento do log de consultas
A partir do Hologres V3.0.9, a instrução CREATE TABLE AS gera dois registros em hologres.hg_query_log: um referente à própria instrução CREATE TABLE AS e outro para a instrução INSERT interna usada na cópia dos dados. Ambos os registros são vinculados por um ID de transação.
Para recuperar ambos os registros de uma execução específica:
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 presente no 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 abaixo 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');
Cópia 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, porém 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 esquema (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 executa nenhuma ação e retorna:
NOTICE: relation "new_table" already exists, skipping
Criar 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 usam esta tabela particionada de origem:
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');
O comando CREATE TABLE AS sempre gera uma tabela não particionada. Ele não consegue replicar restrições de chave de particionamento ou 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;
Apenas os dados de src_table_child1 são copiados.
Criar a partir de uma consulta SELECT e definir propriedades da tabela
Crie uma tabela baseada no 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;