O comando CREATE TABLE LIKE cria uma nova tabela com o mesmo schema do resultado de uma consulta SELECT, sem copiar dados. Use esse recurso para duplicar a estrutura de uma tabela em cenários de teste, staging ou reutilização de schema.
Funcionamento
No Hologres, o CREATE TABLE LIKE é implementado como um stored procedure:
CALL hg_create_table_like('new_table_name', 'select_query');
Esse procedimento cria uma tabela chamada new_table_name com base no schema do resultado da select_query. Nenhum dado é inserido.
Para copiar também as propriedades da tabela (chave primária, índices, entre outros), além do schema, use SELECT * FROM <source_table> como consulta e ative a cópia de propriedades no nível da sessão:
-- Enable property copying for this session (Hologres V0.10 and later)
SET hg_experimental_enable_create_table_like_properties = true;
CALL hg_create_table_like('new_table_name', 'select * from source_table_name');
O que é copiado
A tabela a seguir resume quais propriedades o CREATE TABLE LIKE copia, conforme a sintaxe da consulta e a versão do Hologres.
|
Propriedade |
** |
**Outra sintaxe de |
Observações |
|
Schema das colunas (nomes, tipos) |
Sim |
Sim |
Sempre copiado |
|
Chave primária |
Sim |
Não |
Requer |
|
Índices (bitmap, etc.) |
Sim |
Não |
Requer |
|
Chave de distribuição |
Sim |
Não |
Requer |
|
Comentários de coluna |
Sim |
Sim |
Sempre copiados |
|
Propriedades de binary logging (Binlog) |
Sim |
Sim |
Sempre copiadas |
|
Comentários de tabela |
Sim (V3.0.33+) |
Sim (V3.0.33+) |
Não suportado antes da V3.0.33 |
|
Propriedades de partição dinâmica |
Não |
Não |
Nunca copiadas |
|
Dados |
Não |
Não |
Nunca copiados |
No Hologres V0.9 e versões anteriores, o CREATE TABLE LIKE copia apenas o schema das colunas. Propriedades da tabela, como chaves primárias e índices, não são copiadas, independentemente da sintaxe.
Sintaxe
Tabelas padrão
-- Copy schema only (all versions)
CALL hg_create_table_like('new_table_name', 'select_query');
-- Copy schema and properties (V0.10 and later)
SET hg_experimental_enable_create_table_like_properties = true;
CALL hg_create_table_like('new_table_name', 'select * from source_table_name');
Se a consulta contiver aspas simples, use os delimitadores $$ para evitar caracteres de escape:
CALL hg_create_table_like('table_name', $$query_sql$$ [, 'partition_clause']);
Tabelas particionadas
-- Copy schema and create a partitioned table (all versions)
CALL hg_create_table_like('new_table_name', 'select_query', 'partition_clause');
As tabelas de partição filha não são criadas automaticamente. Crie-as manualmente após criar a tabela pai.
Parâmetros
|
Parâmetro |
Descrição |
|
|
Nome da tabela a ser criada. Deve ser uma string fixa — concatenação de strings e nomes gerados por funções não são suportados. Não pode ser uma foreign table. |
|
|
String de consulta SQL. Se a consulta for exatamente |
|
|
(Apenas tabelas particionadas) Cláusula que define a estrutura de partição, como |
Exemplos
Os exemplos a seguir usam 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;
Copiar uma tabela com suas propriedades
-- Enable property copying for this session
SET hg_experimental_enable_create_table_like_properties = true;
CALL hg_create_table_like('new_table', 'select * from src_table');
A tabela resultante tem o mesmo schema, chave primária, índices e outras propriedades da src_table.
Adicionar uma coluna com base na tabela de origem
-- Create a table with an extra column "c" derived from column "b"
CALL hg_create_table_like('holo_table_1', $$select *, "b" as c from src_table$$);
Cada coluna na consulta deve ter um alias exclusivo. Se duas colunas compartilharem o mesmo alias, a instrução falhará com um erro semelhante a column "c" specified more than once.
Criar uma tabela particionada
-- Add a column "ds" and partition the table by it
CALL hg_create_table_like('new_table', $$select *, "b" as ds from src_table$$, 'partition by list(ds)');
Após criar a tabela pai, crie as partições filhas manualmente:
CREATE TABLE new_table_child_20201213 PARTITION OF new_table FOR VALUES IN ('20201213');
CREATE TABLE new_table_child_20201214 PARTITION OF new_table FOR VALUES IN ('20201214');
Copiar uma tabela pelo console HoloWeb
O HoloWeb oferece uma interface para copiar tabelas sem escrever SQL.
Acesse a página do HoloWeb. Para mais informações, consulte Conectar ao HoloWeb e executar uma consulta.
Na barra de menu superior, clique em Metadata Management.
Na lista Logged-in Instances, clique com o botão direito na tabela que deseja copiar e selecione Replicate Table Schema.
-
Na aba Replicate Table Schema, configure os seguintes parâmetros.
Categoria
Parâmetro
Descrição
Local de destino
Nome da tabela
Nome da tabela de destino. O padrão é
<source_table_name>_copy.Local de destino
Descrição
Descrição opcional para a tabela de destino.
Local de destino
Schema
Schema da tabela de destino. O padrão é
public.Opções avançadas
Sincronizar propriedades da tabela de origem
Define se as propriedades da tabela serão copiadas para a tabela de destino. Requer Hologres V0.10 ou posterior. Se sua versão for anterior à V0.10, selecione No ou atualize sua instância.

Clique em Submit.
Limitações
V0.9 e anteriores: Apenas o schema das colunas é copiado. Propriedades da tabela, como chaves primárias e índices, não são copiadas. Verifique a versão da sua instância na página do produto no console do Hologres.
Restrição de sintaxe para cópia de propriedades: Quando o parâmetro
hg_experimental_enable_create_table_like_propertiesestá ativado, a cópia de propriedades funciona apenas comSELECT * FROM <table_name>. Seleções parciais de colunas, comoSELECT col1, col2 FROM <table_name>, não copiam as propriedades.new_table_namedeve ser uma string fixa: Concatenação de strings e nomes gerados por funções não são suportados.Foreign tables não permitidas: A tabela de destino não pode ser uma foreign table.
Partições filhas não são automáticas: As tabelas de partição filha devem ser criadas manualmente.
Propriedades de partição dinâmica nunca são copiadas, independentemente da versão ou das configurações de GUC.