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:
CREATE HYBRID TABLE … AS SELECT (CTAS) (cria uma tabela preenchida; também referenciada como CTAS)
CREATE HYBRID TABLE … LIKE (cria uma cópia vazia de uma tabela híbrida existente)
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>' ]
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> , ... ] ) ]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 colunaAUTOINCREMENT
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
eNOORDER
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 colunasAUTOINCREMENT
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
eIDENTITY
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
eAUTOINCREMENT
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 colunasAUTOINCREMENT
.
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) );
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> [ ... ]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> [ ... ]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)
);
+-------------------------------------+
| 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"}');
+-------------------------+
| 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';
+-------------------------------+---------+---------------+-------------+-------+-----------+---------+------------+------+-------+--------+----------------+----------------------+-----------------+---------------------+------------------------------+---------------------------+-------------+
| 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;
+-------------------------------+---------------------------+---------------+-------------+--------------+--------------+------+-------+---------+
| 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;
+-------------------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| 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';
+-------------+-----------+----------------+------------------------------+
| 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)
);
Insira as seguintes linhas:
INSERT INTO employee VALUES
(1, 'John Doe', 'Marketing'),
(2, 'Jane Smith', 'Sales'),
(3, 'Bob Johnson', 'Finance'),
(4, 'Alice Brown', 'Marketing');
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');
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;
+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+-------------+-------------+----------------+
| 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.