CREATE HYBRID TABLE

在当前/指定架构中创建新的混合表或替换现有表。一个表可以有多个列,每个列定义均涵盖名称、数据类型,以及列是否符合以下条件:

  • 需要一个 NOT NULL 值。

  • 具有默认值或为标识列。

  • 具有任何内联约束。

备注

创建混合表时,必须在一个或多个列上定义主键约束。

您还可以使用以下 CREATE TABLE 变体来创建混合表:

  • :ref:`label-create_hybrid_table_as`(创建一个已填充的表;也称为 CTAS)

  • :ref:`label-create_hybrid_table_like`(创建现有混合表的空副本)

对于用于标准 Snowflake 表的完整 CREATE TABLE 语法,请参阅 CREATE TABLE

另请参阅:

CREATE INDEX DROP INDEXSHOW INDEXESALTER TABLEDROP TABLESHOW TABLES

语法

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

其中:

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

有关内联和外联约束的详细信息,请参阅 CREATE | ALTER TABLE ...CONSTRAINT

必填参数

name

指定表的标识符(即名称);对于在其中创建表的架构必须唯一。

此外,标识符必须以字母字符开头,且不能包含空格或特殊字符,除非整个标识符字符串放在双引号内(例如,"My object")。放在双引号内的标识符也区分大小写。

有关更多信息,请参阅 标识符要求

col_name

指定列标识符(即名称)。表标识符的所有要求也适用于列标识符。

有关更多详细信息,请参阅 标识符要求保留和受限关键字

备注

除了标准的保留关键字之外,以下关键字不能用作列标识符,因为它们是为 ANSI 标准上下文函数保留的:

  • CURRENT_DATE

  • CURRENT_ROLE

  • CURRENT_TIME

  • CURRENT_TIMESTAMP

  • CURRENT_USER

有关保留关键字的列表,请参阅 保留和受限关键字

col_type

指定列的数据类型。

有关可为表列指定的数据类型的详细信息,请参阅 SQL 数据类型参考

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

可以在列定义中(内联)或单独(外联)指定表所需的主键约束。另请参阅 混合表的约束

有关完整的语法详细信息,请参阅 CREATE | ALTER TABLE ...CONSTRAINT。有关约束的一般信息,请参阅 约束

可选参数

DEFAULT ... . AUTOINCREMENT ...

指定在未通过 INSERT 或 CREATE HYBRID TABLE AS SELECT 语句明确指定值的情况下,是否自动在列中插入默认值:

DEFAULT expr

使用指定的表达式定义列的默认值,该表达式可以是以下任意项:

  • 常量值。

  • 简单表达式。

  • 序列参考 (seq_name.NEXTVAL)。

简单表达式是返回标量值的表达式;但是,该表达式 不能 包含对以下内容的引用:

  • 子查询。

  • 汇总。

  • 窗口函数。

  • 外部函数。

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

当使用 AUTOINCREMENT 时,列的默认值以指定的数字开头,并且每个连续值都会自动生成。AUTOINCREMENT 列生成的值保证是唯一的。任何一对生成的值之间的差都可以保证是增量金额的倍数。

可选的 ORDERNOORDER 参数指定生成的值是否提供 序列语义 中指定的排序保证。NOORDER 是混合表上的 AUTOINCREMENT 列的默认选项。NOORDER 通常为点写入提供明显更好的性能。

这些参数只能用于具有数值数据类型的列(NUMBER、INT、FLOAT 等)。

AUTOINCREMENTIDENTITY 是同义的。如果为列指定了任一参数,则 Snowflake 将利用序列来生成列的值。有关序列的更多信息,请参阅 使用序列

start 和 step/increment 的默认值均为 1

默认值:无值(列没有默认值)

备注

  • DEFAULTAUTOINCREMENT 是互斥的;只能为一列指定一个值。

  • 对于性能敏感型工作负载,NOORDER 是推荐的 AUTOINCREMENT 列选项。

CONSTRAINT ...

为表中的指定列定义内联或行外约束。混合表列的唯一性和外键约束是可选的。另请参阅 混合表的约束

有关完整的语法详细信息,请参阅 CREATE | ALTER TABLE ...CONSTRAINT。有关约束的一般信息,请参阅 约束

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

指定表中一个或多个列的二级索引。(当您对混合表列定义约束时,会对这些列自动创建索引。)

由于与每条记录的键的底层存储引擎关联的空间约束,因此不能对 半结构化的列 (VARIANT、OBJECT、ARRAY) 定义索引。

不能在 地理空间列 (VECTOR) 中定义索引。

可以在创建表时定义索引,或使用 CREATE INDEX 命令定义索引。有关创建混合表索引的更多信息,请参阅 CREATE INDEX

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

为二级索引指定一个或多个包含的列。当经常进行有一系列列在投影列表但不在谓词列表中的查询时,将包含的列与二级索引一起使用可能特别有用。请参阅:创建一个带有 INCLUDE 列的二级索引

INCLUDE 列不能是半结构化列(VARIANT、OBJECT、ARRAY)或地理空间列(GEOGRAPHY、GEOMETRY)。

只能在创建带有二级索引的表时指定 INCLUDE 列。

COMMENT = 'string_literal'

指定列、约束或表级别的注释。有关详细信息,请参阅 关于约束的注释

默认:无值

使用说明

  • 要重新创建或替换混合表,请调用 GET_DDL 函数来查看混合表的定义,然后再运行 CREATE OR REPLACE HYBRID TABLE 命令。

  • 您无法创建 临时或瞬态 的混合表。反之,您无法在瞬态架构或数据库中创建混合表。

  • 架构不能包含同名的表和/或视图。创建表时:

    • 如果架构中已存在同名视图,则会返回错误,并且不会创建表。

    • 如果架构中已存在同名的表,则会返回错误,并且不会创建表,除非命令中包含可选的 OR REPLACE 关键字。

    重要

    使用 OR REPLACE 相当于对现有表执行 DROP TABLE,然后创建具有相同名称的新表。

    请注意,删除和创建操作发生在单个原子操作中。这意味着与 CREATE OR REPLACE TABLE 操作并行的任何查询都使用旧的或新的表版本。

    重新创建表或交换表会删除其更改数据。

  • 保留关键字 类似,ANSI 保留函数名称(CURRENT_DATECURRENT_TIMESTAMP 等)不能用作列名。

  • 关于元数据:

    注意

    客户应确保在使用 Snowflake 服务时,不会将个人数据(用户对象除外)、敏感数据、出口管制数据或其他受监管数据作为元数据输入。有关更多信息,请参阅 Snowflake 中的元数据字段

混合表的约束

  • 创建混合表时,必须设置主键约束。

    支持多列(或复合)主键。要定义多列主键,请使用以下示例中的语法,其中约束是行外约束,并引用之前为表定义的多个列:

    CREATE OR REPLACE HYBRID TABLE ht2pk (
      col1 INTEGER NOT NULL,
      col2 INTEGER NOT NULL,
      col3 VARCHAR,
      CONSTRAINT pkey_1 PRIMARY KEY (col1, col2)
      );
    
    Copy
  • 对混合表上强制执行主键、唯一约束和外键约束。有关这些约束的限制,请参阅 混合表不支持的功能和限制

  • 主键、唯一约束和外键约束分别构建自己的基础索引。这些索引会导致存储其他数据。在创建表时,也可以使用 outoflineIndex 语法显式定义二级(或覆盖)索引。

CREATE HYBRID TABLE ...AS SELECT (CTAS)

创建新的混合表,其中包含查询的结果:

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

备注

使用 CTAS 创建混合表时,请显式定义表架构,包括列定义、主键、索引和其他约束条件。不要依赖从 SELECT 语句推断架构。

指定的列名称数量必须与查询中的 SELECT 列表项数量匹配。

要以特定顺序创建带有行的表,请在查询末尾使用 ORDER BY 子句。

有关加载混合表的信息,请参阅 加载数据

CREATE HYBRID TABLE ... LIKE

使用与现有混合表相同的列定义创建新的混合表,但不从现有表中复制数据。

列名称、类型、默认值和约束将复制到新表中:

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

备注

CREATE HYBRID TABLE ... LIKE 仅支持将另一个混合表作为源表类型。

当前不支持具有通过数据共享访问的自动递增序列的表的 CREATE HYBRID TABLE ... LIKE。

示例

在当前数据库中创建一个混合表,以 customer_id 为主键,对 email 具有唯一约束,同时对 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. |
+-------------------------------------+

在此表中插入一行:

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

主键必须是唯一的。例如,如果再次尝试插入上一示例中的相同主键,则命令将失败,并显示以下错误:

200001 (22000): Primary key already exists

电子邮件地址也必须遵循内联 UNIQUE 约束。例如,如果尝试插入具有相同电子邮件地址的两条记录,则语句将失败,并显示以下错误:

Duplicate key value violates unique constraint "SYS_INDEX_MYTABLE_UNIQUE_EMAIL"

查看表属性和元数据。请注意 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           |
+-------------------------------+---------+---------------+-------------+-------+-----------+---------+------------+------+-------+--------+----------------+----------------------+-----------------+---------------------+------------------------------+---------------------------+-------------+

查看所有混合表的详细信息:

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

显示有关表中各列的信息:

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

从表中选择数据:

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

创建一个带有 INCLUDE 列的二级索引

例如,创建带有覆盖索引的 employee 表:

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

插入以下行:

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

以下查询将使用覆盖索引:

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

这两个查询都将通过避免基表的查找而从覆盖索引中获益。但是,请注意,使用索引中包含的列可能会导致存储使用量增加,因为二次索引中将存储额外的列。

创建一个混合表,并在主键列上添加注释

创建一个混合表,其中在主键的列定义中添加注释。

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

请注意,如果您将此注释添加至 CONSTRAINT 子句,则该注释在 DESCRIBE TABLE 输出中不可见。您可以查询 TABLE_CONSTRAINTS 视图,查看有关约束的完整信息。

语言: 中文