CREATE HYBRID TABLE¶
Crée une nouvelle table hybride dans le schéma actuel/spécifié ou remplace une table existante. Une table peut avoir plusieurs colonnes, chaque définition de colonne étant constituée d’un nom, d’un type de données et, éventuellement si la colonne :
Nécessite une valeur NOT NULL.
A une valeur par défaut ou est une colonne d’identité.
Possède des contraintes en ligne.
Note
Lorsque vous créez une table hybride, vous devez définir une contrainte de clé primaire sur une ou plusieurs colonnes.
Vous pouvez également utiliser les variantes CREATE TABLE suivantes pour créer des tables hybrides :
CREATE HYBRID TABLE. .. AS SELECT (CTAS) (crée une table remplie, aussi appelée CTAS)
CREATE HYBRID TABLE … LIKE (crée une copie vide d’une table hybride existante)
Pour la syntaxe complète CREATE TABLE utilisée pour les tables standard de Snowflake, voir CREATE TABLE.
- Voir aussi :
CREATE INDEX DROP INDEX, SHOW INDEXES, ALTER TABLE, DROP TABLE, SHOW TABLES
Syntaxe¶
CREATE [ OR REPLACE ] HYBRID TABLE [ IF NOT EXISTS ] <table_name>
( <col_name> <col_type>
[
{
DEFAULT <expr>
| { AUTOINCREMENT | IDENTITY }
[
{
( <start_num> , <step_num> )
| START <num> INCREMENT <num>
}
]
[ { ORDER | NOORDER } ]
}
]
[ NOT NULL ]
[ inlineConstraint ]
[ COMMENT '<string_literal>' ]
[ , <col_name> <col_type> [ ... ] ]
[ , outoflineConstraint ]
[ , outoflineIndex ]
[ , ... ]
)
[ COMMENT = '<string_literal>' ]
Où :
inlineConstraint ::= [ CONSTRAINT <constraint_name> ] { UNIQUE | PRIMARY KEY | { [ FOREIGN KEY ] REFERENCES <ref_table_name> [ ( <ref_col_name> ) ] } } [ <constraint_properties> ] outoflineConstraint ::= [ CONSTRAINT <constraint_name> ] { UNIQUE [ ( <col_name> [ , <col_name> , ... ] ) ] | PRIMARY KEY [ ( <col_name> [ , <col_name> , ... ] ) ] | [ FOREIGN KEY ] [ ( <col_name> [ , <col_name> , ... ] ) ] REFERENCES <ref_table_name> [ ( <ref_col_name> [ , <ref_col_name> , ... ] ) ] } [ <constraint_properties> ] [ COMMENT '<string_literal>' ] outoflineIndex ::= INDEX <index_name> ( <col_name> [ , <col_name> , ... ] ) [ INCLUDE ( <col_name> [ , <col_name> , ... ] ) ]Pour plus de détails sur les contraintes en ligne et hors ligne, voir CREATE | ALTER TABLE … CONSTRAINT.
Paramètres requis¶
name
Indique l’identificateur (c’est-à-dire le nom) de la table ; doit être unique pour le schéma dans lequel la table est créée.
De plus, l’identificateur doit commencer par un caractère alphabétique et ne peut pas contenir d’espaces ou de caractères spéciaux à moins que toute la chaîne d’identificateur soit délimitée par des guillemets doubles (par exemple,
"My object"
). Les identificateurs entre guillemets doubles sont également sensibles à la casse.Pour plus d’informations, voir Exigences relatives à l’identificateur.
col_name
Indique l’identificateur de colonne (c’est-à-dire le nom). Toutes les exigences relatives aux identificateurs de table s’appliquent également aux identificateurs de colonne.
Pour plus de détails, voir Exigences relatives à l’identificateur et Mots clés réservés et limités.
Note
En plus des mots clés réservés standard, les mots clés suivants ne peuvent pas être utilisés comme identificateurs de colonnes, car ils sont réservés aux fonctions de contexte standard ANSI :
CURRENT_DATE
CURRENT_ROLE
CURRENT_TIME
CURRENT_TIMESTAMP
CURRENT_USER
Pour la liste des mots clés réservés, voir Mots clés réservés et limités.
col_type
Spécifie le type de données pour la colonne.
Pour plus de détails sur les types de données qui peuvent être spécifiés pour les colonnes de la table, voir Référence de types de données SQL.
PRIMARY KEY ( col_name [ , col_name , ... ] )
Spécifie la contrainte de clé primaire requise pour la table, soit dans une définition de colonne (en ligne), soit séparément (hors ligne). Voir aussi Contraintes des tables hybrides.
Pour les détails complets de la syntaxe, voir CREATE | ALTER TABLE … CONSTRAINT. Pour des informations générales sur les contraintes, voir Contraintes.
Paramètres facultatifs¶
DEFAULT ...
ou .AUTOINCREMENT ...
Indique si une valeur par défaut est automatiquement insérée dans la colonne lorsqu’une valeur n’est pas spécifiée explicitement via une instruction INSERT ou CREATE HYBRID TABLE AS SELECT :
DEFAULT expr
La valeur par défaut de la colonne est définie par l’expression spécifiée, qui peut être l’une des suivantes :
Valeur constante.
Expression simple.
Référence de séquence (
seq_name.NEXTVAL
).
Une expression simple est une expression qui affiche une valeur scalaire ; cependant, l’expression ne peut pas contenir de références aux éléments suivants :
Sous-requêtes.
Agrégats.
Des fonctions de fenêtre.
Fonctions externes.
{ AUTOINCREMENT | IDENTITY }
.[ { ( start_num , step_num ) | START num INCREMENT num } ]
.[ { ORDER | NOORDER } ]
Quand
AUTOINCREMENT
est utilisé, la valeur par défaut de la colonne commence par un nombre spécifié et chaque valeur successive augmente automatiquement. Les valeurs générées par une colonneAUTOINCREMENT
sont garanties uniques. La différence entre n’importe quelle paire de valeurs générées est garantie comme étant un multiple du montant de l’incrément.Les paramètres facultatifs
ORDER
etNOORDER
indiquent si les valeurs générées fournissent ou non des garanties d’ordre comme spécifié dans Sémantique de séquence.NOORDER
est l’option par défaut pour les colonnesAUTOINCREMENT
des tables hybrides. L’optionNOORDER
offre généralement de meilleures performances pour les écritures ponctuelles.Ces paramètres ne peuvent être utilisés qu’avec des colonnes avec des types de données numériques (NUMBER, INT, FLOAT, etc).
AUTOINCREMENT
etIDENTITY
sont synonymes. Si l’une ou l’autre est spécifiée pour une colonne, Snowflake utilise une séquence pour générer les valeurs de la colonne. Pour plus d’informations sur les séquences, voir Utilisation de séquences.La valeur par défaut pour le démarrage et les paliers/incréments est de
1
.
Par défaut : aucune valeur (la colonne n’a pas de valeur par défaut)
Note
DEFAULT
etAUTOINCREMENT
s’excluent mutuellement ; une seule des deux peut être spécifiée pour une colonne.Pour les charges de travail sensibles aux performances,
NOORDER
est l’option recommandée pour les colonnesAUTOINCREMENT
.
CONSTRAINT ...
Définit une contrainte en ligne ou hors ligne pour la ou les colonnes spécifiées dans la table. Les contraintes de clé étrangère et unique sont facultatives pour les colonnes de table hybrides. Voir aussi Contraintes des tables hybrides.
Pour les détails complets de la syntaxe, voir CREATE | ALTER TABLE … CONSTRAINT. Pour des informations générales sur les contraintes, voir Contraintes.
INDEX index_name ( col_name [ , col_name , ... ]
Spécifie un index secondaire sur une ou plusieurs colonnes de la table. (Lorsque vous définissez des contraintes sur des colonnes de table hybride, des index sont automatiquement créés sur ces colonnes.)
Les index ne peuvent pas être définis sur des colonnes semi-structurées (VARIANT, OBJECT, ARRAY) en raison de contraintes d’espace associées aux moteurs de stockage sous-jacents pour la clé de chaque enregistrement.
Les index ne peuvent pas être définis sur des colonnes géospatiales (GEOGRAPHY, GEOMETRY) ou des types de données vectorielles (VECTOR).
Les index peuvent être définis lors de la création de la table ou avec la commande CREATE INDEX. Pour plus d’informations sur la création d’index pour les tables hybrides, voir CREATE INDEX.
INCLUDE ( col_name [ , col_name , ... ] )
Spécifie une ou plusieurs colonnes incluses pour un index secondaire. L’utilisation de colonnes incluses avec un index secondaire est particulièrement utile lorsque les requêtes contiennent fréquemment un ensemble de colonnes dans la liste de projection mais pas dans la liste des prédicats. Voir Créer un index secondaire avec une colonne INCLUDE.
Les colonnes INCLUDE ne peuvent pas être des colonnes semi-structurées (VARIANT, OBJECT, ARRAY) ou des colonnes géospatiales (GEOGRAPHY, GEOMETRY).
Les colonnes INCLUDE ne peuvent être spécifiées que lors de la création d’une table avec un index secondaire.
COMMENT = 'string_literal'
Spécifie un commentaire au niveau de la colonne, de la contrainte ou de la table. Pour plus de détails, voir Commentaires au niveau des contraintes.
Par défaut : aucune valeur
Notes sur l’utilisation¶
Pour recréer ou remplacer une table hybride, appelez la fonction GET_DDL pour voir la définition de la table hybride avant d’exécuter une commande CREATE OR REPLACE HYBRID TABLE.
Vous ne pouvez pas créer de tables hybrides qui sont temporaires ou transitoires. À l’inverse, vous ne pouvez pas créer de tables hybrides dans des schémas ou des bases de données transitoires.
Un schéma ne peut pas contenir de tables et/ou de vues portant le même nom. Lors de la création d’une table :
Si une vue portant le même nom existe déjà dans le schéma, une erreur est renvoyée et la table n’est pas créée.
Si une table portant le même nom existe déjà dans le schéma, une erreur est renvoyée et la table n’est pas créée, sauf si le mot clé facultatif
OR REPLACE
est inclus dans la commande.
Important
Utiliser
OR REPLACE
équivaut à utiliser DROP TABLE sur la table existante, puis à créer une nouvelle table avec le même nom.Notez que les actions de destruction et de création se produisent en une seule opération atomique. Cela signifie que toutes les requêtes simultanées à l’opération CREATE OR REPLACE TABLE utilisent soit l’ancienne soit la nouvelle version de la table.
La recréation ou le remplacement d’une table entraîne la destruction de ses données de modification.
Comme les mots clés réservés, les noms de fonctions réservés ANSI (CURRENT_DATE, CURRENT_TIMESTAMP, etc.) ne peuvent pas être utilisés comme noms de colonnes.
Concernant les métadonnées :
Attention
Les clients doivent s’assurer qu’aucune donnée personnelle (autre que pour un objet utilisateur), donnée sensible, donnée à exportation contrôlée ou autre donnée réglementée n’est saisie comme métadonnée lors de l’utilisation du service Snowflake. Pour plus d’informations, voir Champs de métadonnées dans Snowflake.
Contraintes des tables hybrides¶
Une table hybride doit être créée avec une contrainte de clé primaire.
Les clés primaires à plusieurs colonnes (ou composites) sont prises en charge. Pour définir une clé primaire à plusieurs colonnes, utilisez la syntaxe indiquée dans l’exemple suivant, où la contrainte est définie « hors ligne » et fait référence à plusieurs colonnes précédemment définies pour la table :
CREATE OR REPLACE HYBRID TABLE ht2pk ( col1 INTEGER NOT NULL, col2 INTEGER NOT NULL, col3 VARCHAR, CONSTRAINT pkey_1 PRIMARY KEY (col1, col2) );
Les contraintes de clé étrangère, unique et primaire sont appliquées aux tables hybrides. Pour plus d’informations sur les limitations de ces contraintes, voir Fonctionnalités non prises en charge et limitations concernant les tables hybrides.
Les contraintes de clé étrangère, unique et primaire créent chacune leur propre index sous-jacent. Ces index permettent de stocker des données supplémentaires. Les index secondaires (ou de couverture) peuvent également être définis explicitement lors de la création de la table, à l’aide de la syntaxe
outoflineIndex
.
CREATE HYBRID TABLE. .. AS SELECT (CTAS)¶
Crée une table hybride contenant les résultats d’une requête :
CREATE [ OR REPLACE ] HYBRID TABLE <table_name> [ ( <col_name> [ <col_type> ] , <col_name> [ <col_type> ] , ... ) ] AS <query> [ ... ]Note
Lorsque vous utilisez CTAS pour créer une table hybride, définissez explicitement le schéma de la table, y compris les définitions de colonne, la clé primaire, les index et les autres contraintes. Ne vous fiez pas à la déduction du schéma à partir d’une instruction SELECT.
Le nombre de noms de colonnes spécifiés doit correspondre au nombre des éléments de la liste SELECT dans la requête.
Pour créer la table avec des lignes dans un ordre spécifique, utilisez une clause ORDER BY à la fin de la requête.
Pour plus d’informations sur le chargement de tables hybrides, voir Chargement des données.
CREATE HYBRID TABLE … LIKE¶
Crée une nouvelle table hybride avec les mêmes définitions de colonnes qu’une table hybride existante, mais sans copier les données de la table existante.
Les noms de colonnes, les types, les valeurs par défaut et les contraintes sont copiés dans la nouvelle table :
CREATE [ OR REPLACE ] HYBRID TABLE <table_name> LIKE <source_hybrid_table> [ ... ]Note
CREATE HYBRID TABLE … LIKE ne prend en charge qu’une autre table hybride en tant que type de table source.
CREATE HYBRID TABLE … LIKE pour une table avec une séquence d’auto-incrémentation à laquelle on accède par un partage de données n’est pas pris en charge.
Exemples¶
Créer une table hybride dans la base de données actuelle avec customer_id
comme clé primaire, une contrainte unique sur email
et un index secondaire sur full_name
:
CREATE HYBRID TABLE mytable (
customer_id INT AUTOINCREMENT PRIMARY KEY,
full_name VARCHAR(255),
email VARCHAR(255) UNIQUE,
extended_customer_info VARIANT,
INDEX index_full_name (full_name)
);
+-------------------------------------+
| status |
|-------------------------------------|
| Table MYTABLE successfully created. |
+-------------------------------------+
Insérez une ligne dans cette table :
INSERT INTO mytable (customer_id, full_name, email, extended_customer_info)
SELECT 100, 'Jane Doe', 'jdoe@gmail.com',
parse_json('{"address": "1234 Main St", "city": "San Francisco", "state": "CA", "zip":"94110"}');
+-------------------------+
| number of rows inserted |
|-------------------------|
| 1 |
+-------------------------+
La clé primaire doit être unique. Par exemple, si vous tentez d’insérer une deuxième fois la même clé primaire que celle de l’exemple précédent, la commande échouera en affichant l’erreur suivante :
200001 (22000): Primary key already exists
L’adresse e-mail doit également respecter la contrainte UNIQUE en ligne. Par exemple, si vous tentez d’insérer deux enregistrements avec la même adresse e-mail, l’instruction échoue avec l’erreur suivante :
Duplicate key value violates unique constraint "SYS_INDEX_MYTABLE_UNIQUE_EMAIL"
Affichez les propriétés et les métadonnées de la table. Notez la valeur de la colonne is_hybrid
:
SHOW TABLES LIKE 'mytable';
+-------------------------------+---------+---------------+-------------+-------+-----------+---------+------------+------+-------+--------+----------------+----------------------+-----------------+---------------------+------------------------------+---------------------------+-------------+
| created_on | name | database_name | schema_name | kind | is_hybrid | comment | cluster_by | rows | bytes | owner | retention_time | automatic_clustering | change_tracking | search_optimization | search_optimization_progress | search_optimization_bytes | is_external |
|-------------------------------+---------+---------------+-------------+-------+-----------+---------+------------+------+-------+--------+----------------+----------------------+-----------------+---------------------+------------------------------+---------------------------+-------------|
| 2022-02-23 23:53:19.707 +0000 | MYTABLE | MYDB | PUBLIC | TABLE | Y | | | NULL | NULL | MYROLE | 10 | OFF | OFF | OFF | NULL | NULL | N |
+-------------------------------+---------+---------------+-------------+-------+-----------+---------+------------+------+-------+--------+----------------+----------------------+-----------------+---------------------+------------------------------+---------------------------+-------------+
Affichez les détails de toutes les tables hybrides :
SHOW HYBRID TABLES;
+-------------------------------+---------------------------+---------------+-------------+--------------+--------------+------+-------+---------+
| created_on | name | database_name | schema_name | owner | datastore_id | rows | bytes | comment |
|-------------------------------+---------------------------+---------------+-------------+--------------+--------------+------+-------+---------|
| 2022-02-24 02:07:31.877 +0000 | MYTABLE | DEMO_DB | PUBLIC | ACCOUNTADMIN | 2002 | NULL | NULL | |
+-------------------------------+---------------------------+---------------+-------------+--------------+--------------+------+-------+---------+
Affichez les informations sur les colonnes de la table :
DESCRIBE TABLE mytable;
+-------------------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| name | type | kind | null? | default | primary key | unique key | check | expression | comment | policy name |
|-------------------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------|
| CUSTOMER_ID | NUMBER(38,0) | COLUMN | N | NULL | Y | N | NULL | NULL | NULL | NULL |
| FULL_NAME | VARCHAR(256) | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | NULL |
| APPLICATION_STATE | VARIANT | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | NULL |
+-------------------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
Sélectionnez des données à partir de la table :
SELECT customer_id, full_name, email, extended_customer_info
FROM mytable
WHERE extended_customer_info['state'] = 'CA';
+-------------+-----------+----------------+------------------------------+
| CUSTOMER_ID | FULL_NAME | EMAIL | EXTENDED_CUSTOMER_INFO |
|-------------+-----------+----------------+------------------------------|
| 100 | Jane Doe | jdoe@gmail.com | { |
| | | | "address": "1234 Main St", |
| | | | "city": "San Francisco", |
| | | | "state": "CA", |
| | | | "zip": "94110" |
| | | | } |
+-------------+-----------+----------------+------------------------------+
Créer un index secondaire avec une colonne INCLUDE¶
Par exemple, créez la table employee
avec un index de couverture :
CREATE HYBRID TABLE employee (
employee_id INT PRIMARY KEY,
employee_name STRING,
employee_department STRING,
INDEX idx_department (employee_department) INCLUDE (employee_name)
);
Insérer les lignes suivantes :
INSERT INTO employee VALUES
(1, 'John Doe', 'Marketing'),
(2, 'Jane Smith', 'Sales'),
(3, 'Bob Johnson', 'Finance'),
(4, 'Alice Brown', 'Marketing');
Les requêtes suivantes utiliseront l’index de couverture :
SELECT employee_name FROM employee WHERE employee_department = 'Marketing';
SELECT employee_name FROM employee WHERE employee_department IN ('Marketing', 'Sales');
Ces deux requêtes bénéficient de l’index de couverture en évitant les recherches dans la table de base. Il convient toutefois de noter que l’utilisation de colonnes incluses dans des index peut entraîner une augmentation de la consommation de stockage, étant donné que des colonnes supplémentaires seront stockées dans l’index secondaire.
Créer une table hybride avec un commentaire sur la colonne de clé primaire¶
Créer une table hybride qui inclut un commentaire dans la définition de colonne pour la clé primaire.
CREATE OR REPLACE HYBRID TABLE ht1pk
(COL1 NUMBER(38,0) NOT NULL COMMENT 'Primary key',
COL2 NUMBER(38,0) NOT NULL,
COL3 VARCHAR(16777216),
CONSTRAINT PKEY_1 PRIMARY KEY (COL1));
DESCRIBE TABLE ht1pk;
+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+-------------+-------------+----------------+
| name | type | kind | null? | default | primary key | unique key | check | expression | comment | policy name | privacy domain |
|------+-------------------+--------+-------+---------+-------------+------------+-------+------------+-------------+-------------+----------------|
| COL1 | NUMBER(38,0) | COLUMN | N | NULL | Y | N | NULL | NULL | Primary key | NULL | NULL |
| COL2 | NUMBER(38,0) | COLUMN | N | NULL | N | N | NULL | NULL | NULL | NULL | NULL |
| COL3 | VARCHAR(16777216) | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | NULL | NULL |
+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+-------------+-------------+----------------+
Notez que si vous placez ce commentaire dans la clause CONSTRAINT, le commentaire ne sera pas visible dans la sortie DESCRIBE TABLE. Vous pouvez interroger les Vue TABLE_CONSTRAINTS pour voir les informations complètes sur les contraintes.