CREATE HYBRID TABLE

Cria uma nova tabela híbrida no esquema atual/especificado ou substitui uma tabela existente. Uma tabela pode ter várias colunas, com cada definição de coluna consistindo de um nome, tipo de dados e, opcionalmente, se a coluna:

  • Exige um valor NOT NULL.

  • Tem um valor padrão ou é uma coluna de identidade.

  • Tem alguma restrição embutida.

Nota

Ao criar uma tabela híbrida, você deve definir uma restrição de chave primária em uma ou mais colunas.

Você também pode usar as seguintes variantes CREATE TABLE para criar tabelas híbridas:

Para obter a sintaxe CREATE TABLE completa usada para tabelas padrão do Snowflake, consulte CREATE TABLE.

Consulte também:

CREATE INDEX DROP INDEX, SHOW INDEXES, ALTER TABLE, DROP TABLE, SHOW TABLES

Sintaxe

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

Onde:

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

Para detalhes sobre restrição em linha e fora de linha, consulte CREATE | ALTER TABLE … CONSTRAINT.

Parâmetros obrigatórios

name

Especifica o identificador (ou seja, nome) da tabela; deve ser único para o esquema no qual a tabela é criada.

Além disso, o identificador deve começar com um caractere alfabético e não pode conter espaços ou caracteres especiais, a menos que toda a cadeia de caracteres do identificador esteja entre aspas duplas (por exemplo, "My object"). Os identificadores delimitados por aspas duplas também diferenciam letras maiúsculas de minúsculas.

Para obter mais informações, consulte Requisitos para identificadores.

col_name

Especifica o identificador da coluna (ou seja, o nome). Todos os requisitos de identificadores de tabela também se aplicam aos identificadores de coluna.

Para obter mais detalhes, consulte Requisitos para identificadores e Palavras-chave reservadas e limitadas.

Nota

Além das palavras-chave padrão reservadas, as seguintes palavras-chave não podem ser usadas como identificadores de coluna porque são reservadas para funções de contexto padrão ANSI:

  • CURRENT_DATE

  • CURRENT_ROLE

  • CURRENT_TIME

  • CURRENT_TIMESTAMP

  • CURRENT_USER

Para a lista de palavras-chave reservadas, consulte Palavras-chave reservadas e limitadas.

col_type

Especifica o tipo de dados para a coluna.

Para obter mais detalhes sobre os tipos de dados que podem ser especificados para colunas de tabela, consulte Referência dos tipos de dados SQL.

PRIMARY KEY ( col_name [ , col_name , ... ] )

Especifica a restrição de chave primária necessária para a tabela, dentro de uma definição de coluna (em linha) ou separadamente (fora de linha). Consulte também Restrições para tabelas híbridas.

Para obter detalhes completos de sintaxe, consulte CREATE | ALTER TABLE … CONSTRAINT. Para obter informações gerais sobre restrições, consulte Restrições.

Parâmetros opcionais

DEFAULT ... ou . AUTOINCREMENT ...

Especifica se um valor padrão é automaticamente inserido na coluna caso um valor não seja explicitamente especificado por uma instrução INSERT ou CREATE HYBRID TABLE AS SELECT:

DEFAULT expr

O valor padrão da coluna é definido pela expressão especificada que pode ser qualquer uma das opções seguintes:

  • Valor constante.

  • Expressão simples.

  • Referência de sequência (seq_name.NEXTVAL).

Uma expressão simples é uma expressão que retorna um valor escalar; no entanto, a expressão não pode conter referências a:

  • Subconsultas.

  • Agregados.

  • Funções de janela.

  • Funções externas.

{ AUTOINCREMENT | IDENTITY } . [ { ( start_num , step_num ) | START num INCREMENT num } ] . [ { ORDER | NOORDER } ]

Quando AUTOINCREMENT é usado, o valor padrão da coluna começa com um número especificado e cada valor sucessivo é gerado automaticamente. Os valores gerados por uma coluna AUTOINCREMENT têm garantia de serem exclusivos. É garantido que a diferença entre qualquer par de valores gerados seja um múltiplo do valor do incremento.

Os parâmetros opcionais ORDER e NOORDER especificam se os valores gerados fornecem ou não garantias de ordenação conforme especificado em Semântica da sequência. NOORDER é a opção padrão para colunas AUTOINCREMENT em tabelas híbridas. NOORDER normalmente fornece desempenho significativamente melhor para gravações pontuais.

Esses parâmetros só podem ser usados para colunas com tipos de dados numérico (NUMBER, INT, FLOAT etc.)

AUTOINCREMENT e IDENTITY são sinônimos. Se um deles for especificado para uma coluna, o Snowflake utilizará uma sequência para gerar os valores para a coluna. Para obter mais informações sobre sequências, consulte Uso de sequências.

O valor padrão para o início e o passo/incremento é 1.

Padrão: sem valor (a coluna não tem valor padrão)

Nota

  • DEFAULT e AUTOINCREMENT são mutuamente exclusivos; apenas um deles pode ser especificado para uma coluna.

  • Para cargas de trabalho sensíveis ao desempenho, NOORDER é a opção recomendada para colunas AUTOINCREMENT.

CONSTRAINT ...

Define uma restrição em linha ou fora de linha para a(s) coluna(s) especificada(s) na tabela. Restrições de chave estrangeira e exclusiva são opcionais para colunas de tabela híbrida. Consulte também Restrições para tabelas híbridas.

Para obter detalhes completos de sintaxe, consulte CREATE | ALTER TABLE … CONSTRAINT. Para obter informações gerais sobre restrições, consulte Restrições.

INDEX index_name ( col_name [ , col_name , ... ]

Especifica um índice secundário em uma ou mais colunas na tabela. (Quando você define restrições em colunas de tabela híbrida, os índices são criados automaticamente nessas colunas.)

Índices não podem ser definidos em colunas semiestruturadas (VARIANT, OBJECT, ARRAY) devido a restrições de espaço associadas aos mecanismos de armazenamento subjacentes para a chave de cada registro.

Índices não podem ser definidos em colunas geoespaciais (GEOGRAPHY, GEOMETRY) ou tipos de dados vetoriais (VECTOR).

Os índices podem ser definidos quando a tabela é criada ou com o comando CREATE INDEX. Para obter mais informações sobre como criar índices para tabelas híbridas, consulte CREATE INDEX.

INCLUDE ( col_name [ , col_name , ... ] )

Especifica uma ou mais colunas incluídas para um índice secundário. Usar colunas incluídas com um índice secundário é particularmente útil quando as consultas frequentemente contêm um conjunto de colunas na lista de projeção, mas não na lista de predicados. Consulte Crie um índice secundário com uma coluna INCLUDE.

Colunas INCLUDE não podem ser colunas semiestruturadas (VARIANT, OBJECT, ARRAY) ou colunas geoespaciais (GEOGRAPHY, GEOMETRY).

Colunas INCLUDE podem ser especificadas somente quando uma tabela é criada com um índice secundário.

COMMENT = 'string_literal'

Especifica um comentário no nível de coluna, restrição ou tabela. Para obter mais detalhes, consulte Comentários sobre restrições.

Padrão: sem valor

Notas de uso

  • Para recriar ou substituir uma tabela híbrida, chame a função GET_DDL para ver a definição da tabela híbrida antes de executar um comando CREATE OR REPLACE HYBRID TABLE.

  • Você não pode criar tabelas híbridas que sejam temporárias ou transitórias. Por sua vez, você não pode criar tabelas híbridas dentro de esquemas ou bancos de dados transitórios.

  • Um esquema não pode conter tabelas e/ou visualizações com o mesmo nome. Ao criar uma tabela:

    • Se já existir uma visualização com o mesmo nome no esquema, um erro é emitido e a tabela não é criada.

    • Se uma tabela com o mesmo nome já existir no esquema, um erro é emitido e a tabela não é criada, a menos que a palavra-chave opcional OR REPLACE esteja incluída no comando.

    Importante

    Usar OR REPLACE é o equivalente a usar DROP TABLE na tabela existente e depois criar uma nova tabela com o mesmo nome.

    Observe que o descarte e a criação de ações ocorrem em uma única operação atômica. Isso significa que qualquer consulta concorrente com a operação CREATE OR REPLACE TABLE utiliza a versão da tabela antiga ou nova.

    A recriação ou troca de uma tabela descarta seus dados de alteração.

  • Assim como as palavras-chave reservadas, nomes de funções reservadas ANSI (CURRENT_DATE, CURRENT_TIMESTAMP etc.) não podem ser usados como nomes de colunas.

  • Em relação aos metadados:

    Atenção

    Os clientes devem garantir que nenhum dado pessoal (exceto para um objeto do usuário), dados sensíveis, dados controlados por exportação ou outros dados regulamentados sejam inseridos como metadados ao usar o serviço Snowflake. Para obter mais informações, consulte Campos de metadados no Snowflake.

Restrições para tabelas híbridas

  • Uma tabela híbrida deve ser criada com uma restrição de chave primária.

    Chaves primárias multicolunas (ou compostas) são compatíveis. Para definir uma chave primária com várias colunas, use a sintaxe mostrada no exemplo a seguir, onde a restrição é definida “fora da linha” e se refere a várias colunas definidas anteriormente para a tabela:

    CREATE OR REPLACE HYBRID TABLE ht2pk (
      col1 INTEGER NOT NULL,
      col2 INTEGER NOT NULL,
      col3 VARCHAR,
      CONSTRAINT pkey_1 PRIMARY KEY (col1, col2)
      );
    
    Copy
  • Restrições de chave, exclusiva e estrangeira são aplicadas em tabelas híbridas. Para obter informações sobre as limitações dessas restrições, consulte Recursos e limitações não suportados para tabelas híbridas.

  • Restrições de chave primária, única e estrangeira criam seus próprios índices subjacente. Esses índices resultam no armazenamento de dados adicionais. Índices secundários (ou de inclusão) também podem ser definidos explicitamente quando a tabela é criada, usando a sintaxe outoflineIndex.

CREATE HYBRID TABLE … AS SELECT (CTAS)

Cria uma nova tabela híbrida com os resultados de uma consulta:

CREATE [ OR REPLACE ] HYBRID TABLE <table_name> [ ( <col_name> [ <col_type> ] , <col_name> [ <col_type> ] , ... ) ]
  AS <query>
  [ ... ]
Copy

Nota

Ao usar CTAS para criar uma tabela híbrida, defina o esquema da tabela explicitamente, incluindo definições de coluna, chave primária, índices e outras restrições. Não confie na inferência do esquema a partir de uma instrução SELECT.

O número de nomes de colunas especificados deve corresponder ao número de itens da lista SELECT na consulta.

Para criar a tabela com linhas em uma ordem específica, use uma cláusula ORDER BY no final da consulta.

Para obter informações sobre como carregar tabelas híbridas, consulte Carregamento de dados.

CREATE HYBRID TABLE … LIKE

Cria uma nova tabela híbrida com as mesmas definições de coluna que uma tabela híbrida existente, mas sem copiar os dados da tabela existente.

Os nomes das colunas, tipos, padrões e restrições são copiados para a nova tabela:

CREATE [ OR REPLACE ] HYBRID TABLE <table_name> LIKE <source_hybrid_table>
  [ ... ]
Copy

Nota

CREATE HYBRID TABLE … LIKE oferece suporte apenas a outra tabela híbrida como tipo de tabela de origem.

CREATE HYBRID TABLE … LIKE para uma tabela com uma sequência de incremento automático acessada por meio de um compartilhamento de dados não é compatível.

Exemplos

Crie uma tabela híbrida no banco de dados atual com customer_id como a chave primária, uma restrição exclusiva em email e um índice secundário em 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. |
+-------------------------------------+

Insira uma linha nesta tabela:

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

A chave primária deve ser exclusiva. Por exemplo, se você tentar inserir a mesma chave primária do exemplo anterior uma segunda vez, o comando falhará com o seguinte erro:

200001 (22000): Primary key already exists

O endereço de e-mail também deve seguir a restrição UNIQUE em linha. Por exemplo, se você tentar inserir dois registros com o mesmo endereço de e-mail, a instrução falhará com o seguinte erro:

Duplicate key value violates unique constraint "SYS_INDEX_MYTABLE_UNIQUE_EMAIL"

Visualize propriedades e metadados da tabela. Observe o valor da coluna 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           |
+-------------------------------+---------+---------------+-------------+-------+-----------+---------+------------+------+-------+--------+----------------+----------------------+-----------------+---------------------+------------------------------+---------------------------+-------------+

Veja os detalhes de todas as tabelas híbridas:

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

Exibe informações sobre as colunas da tabela:

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

Selecione os dados a partir da tabela:

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"             |
|             |           |                | }                            |
+-------------+-----------+----------------+------------------------------+

Crie um índice secundário com uma coluna INCLUDE

Por exemplo, crie a tabela employee com um índice de cobertura:

CREATE HYBRID TABLE employee (
    employee_id INT PRIMARY KEY,
    employee_name STRING,
    employee_department STRING,
    INDEX idx_department (employee_department) INCLUDE (employee_name)
);
Copy

Insira as seguintes linhas:

INSERT INTO employee VALUES
  (1, 'John Doe', 'Marketing'),
  (2, 'Jane Smith', 'Sales'),
  (3, 'Bob Johnson', 'Finance'),
  (4, 'Alice Brown', 'Marketing');
Copy

As seguintes consultas usarão o índice de cobertura:

SELECT employee_name FROM employee WHERE employee_department = 'Marketing';
SELECT employee_name FROM employee WHERE employee_department IN ('Marketing', 'Sales');
Copy

Ambas as consultas se beneficiam do índice de inclusão, evitando pesquisas na tabela base. No entanto, observe que o uso de colunas incluídas em índices pode causar um aumento no consumo de armazenamento, pois colunas adicionais serão armazenadas no índice secundário.

Criação de uma tabela híbrida com um comentário na coluna da chave primária

Crie uma tabela híbrida que inclua um comentário dentro da definição de coluna para a chave primária.

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

Observe que se você colocar esse comentário na cláusula CONSTRAINT, o comentário não ficará visível na saída DESCRIBE TABLE. É possível consultar Exibição TABLE_CONSTRAINTS para ver informações completas sobre restrições.