Tous les produits
Search
Centre de documentation

Hologres:CREATE TABLE AS

Dernière mise à jour :Aug 11, 2026

CREATE TABLE AS crée une nouvelle table à partir d'une table existante ou du résultat d'une requête SELECT. Elle copie également les données si nécessaire.

Deux variantes syntaxiques sont prises en charge :

  • AS TABLE <src_table_name> : copie le schéma et, éventuellement, les données d'une table ou d'une vue existante.

  • AS <select_query> : crée une table à partir de l'ensemble de résultats d'une requête SELECT.

CREATE TABLE AS copie les schémas de colonnes et les types de données, mais pas les propriétés de la table telles que les clés primaires, les contraintes de nullité, les index ou les valeurs par défaut.

Prérequis

Avant de commencer, assurez-vous de disposer des éléments suivants :

  • Une instance Hologres exécutant la version V1.3.21 ou ultérieure.

  • Une table ou une vue source existante à copier.

Syntaxe

-- 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 ]

Paramètres

Paramètre Description
new_table_name Nom de la nouvelle table. Il doit s'agir d'une chaîne fixe, et non d'une variable ou d'un appel de fonction. Les tables externes ne peuvent pas être créées avec cette instruction.
IF NOT EXISTS Si une table portant le même nom existe déjà, la création est ignorée silencieusement.
src_table_name Nom de la table ou de la vue source. Les vues sont prises en charge dans Hologres V2.1.21 et versions ultérieures.
select_query Une instruction SELECT. Pour plus de détails sur la syntaxe, consultez SELECT.
WITH [ NO ] DATA Contrôle si les données source sont copiées. WITH DATA (par défaut) copie les données. WITH NO DATA crée une table vide avec le même schéma.

Éléments copiés et non copiés

CREATE TABLE AS copie les noms de colonnes et les types de données, mais pas les propriétés de la table.

CREATE TABLE AS CREATE TABLE LIKE
Schémas de colonnes et types de données Copiés Copiés
Propriétés de la table (nullité, valeurs par défaut, index, clés primaires, commentaires) Non copiées Partiellement copiées
Données de la table source Copiées (avec WITH DATA) Non copiées
Configuration manuelle des propriétés (index, clés de distribution) Prise en charge limitée. Les clés primaires ne peuvent pas être configurées manuellement. Prise en charge limitée. Les clés primaires ne peuvent pas être configurées manuellement.
Table non partitionnée à partir d'une table partitionnée Pris en charge Pris en charge
Création de table partitionnée Non pris en charge Partiellement pris en charge (via partition_clause)

Pour plus de détails sur CREATE TABLE LIKE, consultez CREATE TABLE LIKE.

Limites

  • Seules les versions Hologres V1.3.21 et ultérieures prennent en charge CREATE TABLE AS. Pour mettre à niveau une instance antérieure, effectuez la mise à niveau manuellement dans la console Hologres ou rejoignez un groupe DingTalk Hologres pour demander une mise à niveau de l'instance. Pour plus de détails, consultez Mises à niveau des instances ou Comment obtenir une assistance en ligne ?.

  • L'atomicité de l'importation des données n'est pas garantie lors de l'utilisation de WITH DATA.

  • Pour les colonnes dont les types nécessitent une précision — VARCHAR, BPCHAR, NUMERIC (DECIMAL), BIT ou VARBIT — spécifiez explicitement la précision dans l'instruction CREATE TABLE AS. L'omission de la précision entraîne une erreur.

  • Pour les colonnes de type INTERVAL, TIME, TIMETZ, TIMESTAMP ou TIMESTAMPTZ, ne spécifiez pas de précision. La spécification d'une précision pour ces types provoque une erreur.

  • CREATE TABLE AS ne peut pas créer de table partitionnée. Elle crée toujours une table non partitionnée. Lors de la copie à partir d'une table parente partitionnée, l'instruction inclut automatiquement les données de toutes les tables enfants.

  • Dans Hologres V3.0.9 et versions ultérieures, des ressources de calcul serverless peuvent être utilisées pour exécuter CREATE TABLE AS. Pour plus de détails, consultez Utiliser le calcul serverless.

Comportement des journaux de requêtes

À partir de Hologres V3.0.9, CREATE TABLE AS génère deux enregistrements dans hologres.hg_query_log : un pour l'instruction CREATE TABLE AS elle-même, et un pour l'instruction INSERT interne utilisée pour copier les données. Les deux enregistrements sont liés par un ID de transaction.

Pour récupérer les deux enregistrements pour une exécution donnée :

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

Remplacez <transaction_id> par la valeur du champ trans_id de l'enregistrement de journal CREATE TABLE AS.

Dans les versions antérieures à V3.0.9, un seul enregistrement est généré (pour l'instruction CREATE TABLE AS).

Exemples

Copier une table non partitionnée

Les exemples suivants utilisent cette table source :

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');

Copie avec données (par défaut)

CREATE TABLE public.new_table AS TABLE public.src_table;

Interrogez la nouvelle table :

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

La nouvelle table contient les mêmes données, mais n'hérite pas de la clé primaire ni de la contrainte NOT NULL de la table source :

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;

Copie du schéma uniquement (sans données)

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

Ignorer si la table existe déjà

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

Si new_table existe déjà, l'instruction n'a aucun effet et renvoie :

NOTICE: relation "new_table" already exists, skipping

Copie à partir du résultat d'une requête SELECT

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

Copier une table partitionnée

Les exemples suivants utilisent cette table source partitionnée :

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 crée toujours une table non partitionnée. Elle ne peut pas répliquer les contraintes de clé de partition ni les relations d'héritage.

Copie à partir de la table parente (inclut les données de toutes les partitions)

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

Copie à partir d'une seule partition

CREATE TABLE public.new_table_3 AS TABLE public.src_table_child1;

Seules les données de src_table_child1 sont copiées.

Copier à partir d'une requête SELECT et définir les propriétés de la table

Créez une table à partir du résultat d'une requête SELECT et configurez ses propriétés dans la même transaction :

-- 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;

Étapes suivantes