CREATE TABLE AS crea una tabla nueva a partir de una tabla existente o del resultado de una consulta SELECT. De manera opcional, también copia los datos al mismo tiempo.
Se admiten dos variantes de sintaxis:
AS TABLE <src_table_name>: copia el esquema y, de forma opcional, los datos de una tabla o vista existente.AS <select_query>: crea una tabla a partir del conjunto de resultados de una consulta SELECT.
CREATE TABLE AS copia los esquemas de las columnas y los tipos de datos, pero no las propiedades de la tabla, como las claves primarias, las restricciones de nulabilidad, los índices ni los valores predeterminados.
Requisitos previos
Antes de empezar, asegúrese de contar con lo siguiente:
Una instancia de Hologres que ejecute la versión 1.3.21 o posterior.
Una tabla o vista de origen existente desde la cual copiar.
Sintaxis
-- 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 |
Descripción |
|
|
Nombre de la tabla nueva. Debe ser una cadena fija, no una variable ni una llamada a función. Esta instrucción no permite crear tablas externas. |
|
|
Si ya existe una tabla con el mismo nombre, se omite la creación sin generar errores. |
|
|
Nombre de la tabla o vista de origen. Las vistas son compatibles con Hologres V2.1.21 y versiones posteriores. |
|
|
Una instrucción SELECT. Para obtener detalles sobre la sintaxis, consulte SELECT. |
|
|
Controla si se copian los datos de origen. |
Qué se copia y qué no
CREATE TABLE AS copia los nombres de las columnas y los tipos de datos, pero no las propiedades de la tabla.
|
CREATE TABLE AS |
CREATE TABLE LIKE |
|
|
Esquemas de columnas y tipos de datos |
Se copian |
Se copian |
|
Propiedades de la tabla (nulabilidad, valores predeterminados, índices, claves primarias, comentarios) |
No se copian |
Se copian parcialmente |
|
Datos de la tabla de origen |
Se copian (con |
No se copian |
|
Configuración manual de propiedades (índices, claves de distribución) |
Compatibilidad limitada. No es posible configurar las claves primarias de forma manual. |
Compatibilidad limitada. No es posible configurar las claves primarias de forma manual. |
|
Tabla no particionada a partir de una tabla particionada |
Compatible |
Compatible |
|
Creación de tablas particionadas |
No compatible |
Parcialmente compatible (mediante |
Para obtener más información sobre CREATE TABLE LIKE, consulte CREATE TABLE LIKE.
Límites
Solo Hologres V1.3.21 y versiones posteriores son compatibles con
CREATE TABLE AS. Para actualizar una instancia anterior, hágalo manualmente en la consola de Hologres o únase a un grupo de DingTalk de Hologres para solicitar la actualización. Para obtener más información, consulte Instance upgrades o How to get online support?.No se garantiza la atomicidad de la importación de datos cuando se usa
WITH DATA.En las columnas con tipos que requieren precisión (VARCHAR, BPCHAR, NUMERIC (DECIMAL), BIT o VARBIT), especifique la precisión de manera explícita en la instrucción
CREATE TABLE AS. Omitir la precisión genera un error.En las columnas de tipo INTERVAL, TIME, TIMETZ, TIMESTAMP o TIMESTAMPTZ, no especifique la precisión. Hacerlo para estos tipos genera un error.
CREATE TABLE ASno puede crear una tabla particionada, ya que siempre genera una tabla no particionada. Al copiar desde una tabla principal particionada, la instrucción incluye automáticamente los datos de todas las tablas secundarias.A partir de Hologres V3.0.9, es posible usar recursos de cómputo serverless para ejecutar
CREATE TABLE AS. Para obtener más información, consulte Work with serverless computing.
Comportamiento del registro de consultas
A partir de Hologres V3.0.9, CREATE TABLE AS genera dos registros en hologres.hg_query_log: uno para la propia instrucción CREATE TABLE AS y otro para la instrucción interna INSERT que se utiliza para copiar los datos. Ambos registros se vinculan mediante un identificador de transacción.
Para recuperar los dos registros de una ejecución específica, ejecute lo siguiente:
SELECT
query_id,
query,
extended_info
FROM
hologres.hg_query_log
WHERE
extended_info ->> 'source_trx' = '<transaction_id>'
ORDER BY
query_start;
Reemplace <transaction_id> por el valor del campo trans_id del registro de CREATE TABLE AS.
En versiones anteriores a la V3.0.9, solo se genera un registro correspondiente a la instrucción CREATE TABLE AS.
Ejemplos
Copiar una tabla no particionada
A continuación se muestran ejemplos basados en esta tabla de origen:
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 con datos (comportamiento predeterminado)
CREATE TABLE public.new_table AS TABLE public.src_table;
Consulte la tabla nueva:
SELECT * FROM public.new_table;
a | b
---+-----
1 | qaz
2 | wsx
La tabla nueva contiene los mismos datos, pero no hereda la clave primaria ni la restricción NOT NULL de la tabla de origen:
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 solo el esquema (sin datos)
CREATE TABLE public.new_table AS TABLE public.src_table WITH NO DATA;
Omitir la operación si la tabla ya existe
CREATE TABLE IF NOT EXISTS public.new_table AS TABLE public.src_table;
Si new_table ya existe, la instrucción no realiza ninguna acción y devuelve lo siguiente:
NOTICE: relation "new_table" already exists, skipping
Copiar desde el resultado de una consulta SELECT
CREATE TABLE public.new_table_2 AS SELECT * FROM public.src_table WHERE a = 1;
Copiar una tabla particionada
Los siguientes ejemplos utilizan esta tabla particionada de origen:
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 siempre crea una tabla no particionada. No replica las restricciones de la clave de partición ni las relaciones de herencia.
Copiar desde la tabla principal (incluye los datos de todas las particiones)
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 desde una sola partición
CREATE TABLE public.new_table_3 AS TABLE public.src_table_child1;
Solo se copian los datos de src_table_child1.
Copiar desde una consulta SELECT y configurar las propiedades de la tabla
Cree una tabla a partir del resultado de una consulta SELECT y configure sus propiedades en la misma transacción:
-- 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;