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 :

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

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> , ... ] ) ]
Copy

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 colonne AUTOINCREMENT 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 et NOORDER 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 colonnes AUTOINCREMENT des tables hybrides. L’option NOORDER 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 et IDENTITY 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 et AUTOINCREMENT 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 colonnes AUTOINCREMENT.

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)
      );
    
    Copy
  • 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>
  [ ... ]
Copy

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>
  [ ... ]
Copy

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)
);
Copy
+-------------------------------------+
| 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"}');
Copy
+-------------------------+
| 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';
Copy
+-------------------------------+---------+---------------+-------------+-------+-----------+---------+------------+------+-------+--------+----------------+----------------------+-----------------+---------------------+------------------------------+---------------------------+-------------+
| 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;
Copy
+-------------------------------+---------------------------+---------------+-------------+--------------+--------------+------+-------+---------+
| 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;
Copy
+-------------------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| 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';
Copy
+-------------+-----------+----------------+------------------------------+
| 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)
);
Copy

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

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

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;
Copy
+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+-------------+-------------+----------------+
| 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.