CREATE TABLE AS SELECT (CTAS) crée une nouvelle table et la remplit avec les résultats d'une requête. L'instruction CTAS reprend la syntaxe de CREATE TABLE — y compris la création automatique d'un index pour chaque colonne — en y ajoutant une clause SELECT pour définir les données initiales de la table.
Syntaxe
CREATE TABLE [IF NOT EXISTS] <table_name> [table_definition]
[IGNORE|REPLACE] [AS] <query_statement>
Les instructions CTAS et CREATE TABLE partagent les mêmes comportements par défaut. Un index est automatiquement créé pour chaque colonne, quelle que soit l'instruction utilisée pour créer la table.
Paramètres
| Paramètre | Obligatoire | Description |
|---|---|---|
table_name |
Oui | Nom de la nouvelle table. Doit contenir entre 1 et 127 caractères (lettres, chiffres et traits de soulignement _). Le premier caractère doit être une lettre ou un trait de soulignement. Utilisez db_name.table_name pour distinguer les tables homonymes dans différentes bases de données. |
IF NOT EXISTS |
Non | Ignore la création de la table si table_name existe déjà. |
IGNORE |
Non | Avant d'insérer un enregistrement, vérifie s'il existe déjà un enregistrement avec la même clé primaire. Si tel est le cas, ignore le nouvel enregistrement. |
REPLACE |
Non | Avant d'insérer un enregistrement, vérifie s'il existe déjà un enregistrement avec la même clé primaire. Si tel est le cas, écrase l'enregistrement existant par le nouveau. |
Exemples
Tous les exemples suivants créent une table new_customer à partir de la table source suivante :
CREATE TABLE customer (
customer_id BIGINT NOT NULL COMMENT 'Customer ID',
customer_name VARCHAR NOT NULL COMMENT 'Customer name',
phone_num BIGINT NOT NULL COMMENT 'Phone number',
city_name VARCHAR NOT NULL COMMENT 'City',
sex INT NOT NULL COMMENT 'Gender',
id_number VARCHAR NOT NULL COMMENT 'ID card number',
home_address VARCHAR NOT NULL COMMENT 'Home address',
office_address VARCHAR NOT NULL COMMENT 'Office address',
age INT NOT NULL COMMENT 'Age',
login_time TIMESTAMP NOT NULL COMMENT 'Logon time',
PRIMARY KEY (login_time, customer_id, phone_num)
)
DISTRIBUTED BY HASH(customer_id)
PARTITION BY VALUE(DATE_FORMAT(login_time, '%Y%m%d')) LIFECYCLE 30
COMMENT 'Customer information table';
Copier toutes les colonnes
Créez la table new_customer avec les mêmes colonnes et types de données que la table customer :
CREATE TABLE new_customer
AS
SELECT * FROM customer;
Copier des colonnes spécifiques
Créez la table new_customer en ne conservant que les colonnes customer_id et customer_name :
CREATE TABLE new_customer
AS
SELECT customer_id, customer_name
FROM customer;
Définir une clé primaire et une clé de distribution
Copiez les colonnes customer_id et login_time, et définissez explicitement la clé primaire et la clé de distribution de la nouvelle table :
CREATE TABLE new_customer (
PRIMARY KEY (customer_id, login_time)
)
DISTRIBUTED BY HASH (customer_id)
AS
SELECT customer_id, login_time
FROM customer;
Remplacer le type de données d'une colonne
Copiez les colonnes customer_id et login_time, définissez la clé primaire et la clé de distribution, et changez le type de la colonne login_time de TIMESTAMP en DATE :
CREATE TABLE new_customer (
login_time DATE,
PRIMARY KEY (customer_id, login_time)
)
DISTRIBUTED BY HASH (customer_id)
AS
SELECT customer_id, login_time
FROM customer;
Définir un index inversé
Copiez les colonnes customer_id, customer_name et login_time, et définissez customer_id comme colonne d'index inversé :
CREATE TABLE new_customer (
INDEX a_idx (customer_id)
)
AS
SELECT customer_id, customer_name, login_time
FROM customer;