这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

从其他表创建表

您可以通过以下两种方式从其他表创建一个表:

1 - 复制表

可以使用带有 LIKE 子句CREATE TABLE 从现有表创建一个表:

CREATE TABLE [schema.]table-name LIKE [schema.]existing-table
   [ {INCLUDING | EXCLUDING} PROJECTIONS ]
   [ {INCLUDE | EXCLUDE} [SCHEMA] PRIVILEGES ]

使用 LIKE 创建表会复制源表定义以及与其关联的任何存储策略。它不会复制列上的表数据或表达式。

复制约束

CREATE TABLE...LIKE 会复制所有表约束,但以下情况除外:

  • 外键约束

  • 从序列获取值的任何列,包括 IDENTITYAUTO_INCREMENT 列。Vertica 会将列值复制到新表中,但会移除原始约束。例如,以下表定义对列 ID 设置 IDENTITY 约束:

    CREATE TABLE public.Premium_Customer
    (
        ID IDENTITY ,
        lname varchar(25),
        fname varchar(25),
        store_membership_card int
    );
    

    以下 CREATE TABLE...LIKE 语句将此表复制为 All_Customers。Vertica 会从 All_Customers.ID 中移除 IDENTITY 约束,从而将其更改为具有 NOT NULL 约束的整数列:

    => CREATE TABLE All_Customers like Premium_Customer;
    CREATE TABLE
    => select export_tables('','All_Customers');
                       export_tables
    ---------------------------------------------------
    CREATE TABLE public.All_Customers
    (
        ID int NOT NULL,
        lname varchar(25),
        fname varchar(25),
        store_membership_card int
    );
    
    (1 row)
    

包括投影

可以使用 INCLUDING PROJECTIONSEXCLUDING PROJECTIONS 限定 LIKE 子句,指定是否从源表中复制投影:

  • EXCLUDING PROJECTIONS (默认值):不从源表复制投影。

  • INCLUDING PROJECTIONS:从源表复制当前投影。Vertica 会根据 Vertica 命名约定命名新投影,以避免与现有对象发生名称冲突。

包括架构权限

可以为新表指定架构权限的默认继承:

  • EXCLUDE [SCHEMA] PRIVILEGES (默认)禁用从架构继承权限

  • INCLUDE [SCHEMA] PRIVILEGES 为表授予向其架构授予的相同权限

有关详细信息,请参阅设置表和视图的权限继承

限制

对于源表存在以下限制:

  • 不能具有过期投影。

  • 不能为临时表。

示例

  1. 创建表 states

    
    => CREATE TABLE states (
         state char(2) NOT NULL, bird varchar(20), tree varchar (20), tax float, stateDate char (20))
         PARTITION BY state;
    
  2. 向表中填充数据:

    INSERT INTO states VALUES ('MA', 'chickadee', 'american_elm', 5.675, '07-04-1620');
    INSERT INTO states VALUES ('VT', 'Hermit_Thrasher', 'Sugar_Maple', 6.0, '07-04-1610');
    INSERT INTO states VALUES ('NH', 'Purple_Finch', 'White_Birch', 0, '07-04-1615');
    INSERT INTO states VALUES ('ME', 'Black_Cap_Chickadee', 'Pine_Tree', 5, '07-04-1615');
    INSERT INTO states VALUES ('CT', 'American_Robin', 'White_Oak', 6.35, '07-04-1618');
    INSERT INTO states VALUES ('RI', 'Rhode_Island_Red', 'Red_Maple', 5, '07-04-1619');
    
  3. 查看表内容:

    => SELECT * FROM states;
    
    
     state |        bird         |     tree     |  tax  |      stateDate
    -------+---------------------+--------------+-------+----------------------
     VT    | Hermit_Thrasher     | Sugar_Maple  |     6 | 07-04-1610
     CT    | American_Robin      | White_Oak    |  6.35 | 07-04-1618
     RI    | Rhode_Island_Red    | Red_Maple    |     5 | 07-04-1619
     MA    | chickadee           | american_elm | 5.675 | 07-04-1620
     NH    | Purple_Finch        | White_Birch  |     0 | 07-04-1615
     ME    | Black_Cap_Chickadee | Pine_Tree    |     5 | 07-04-1615
    (6 rows
    
  4. 创建示例投影并刷新:

    => CREATE PROJECTION states_p AS SELECT state FROM states;
    
    => SELECT START_REFRESH();
    
  5. 创建一个类似于 states 表的表并包括其投影:

    => CREATE TABLE newstates LIKE states INCLUDING PROJECTIONS;
    
  6. 查看这两个表的投影。Vertica 已将投影从 states 复制到 newstates

    => \dj
                                                          List of projections
                Schema             |                   Name                    |  Owner  |       Node       | Comment
    -------------------------------+-------------------------------------------+---------+------------------+---------
     public                        | newstates_b0                              | dbadmin |                  |
     public                        | newstates_b1                              | dbadmin |                  |
     public                        | newstates_p_b0                            | dbadmin |                  |
     public                        | newstates_p_b1                            | dbadmin |                  |
     public                        | states_b0                                 | dbadmin |                  |
     public                        | states_b1                                 | dbadmin |                  |
     public                        | states_p_b0                               | dbadmin |                  |
     public                        | states_p_b1                               | dbadmin |                  |
    
  7. 查看表 newstates,它显示从 states 复制的列:

    
    => SELECT * FROM newstates;
    
    
     state | bird | tree | tax | stateDate
    -------+------+------+-----+-----------
    (0 rows)
    

使用 CREATE TABLE...LIKE 语句时,系统也会复制与表关联的存储策略对象。添加到新表的数据会使用与源表相同的标记存储位置,除非您更改了存储策略。有关详细信息,请参阅处理存储位置

另请参阅

2 - 从查询创建表

CREATE TABLE 可以指定 AS 子句以从查询创建表,如下所示:

CREATE [TEMPORARY] TABLE [schema.]table-name
    [ ( column-name-list ) ]
    [ {INCLUDE | EXCLUDE} [SCHEMA] PRIVILEGES ]
AS  [  /*+ LABEL */ ] [ AT epoch ] query [ ENCODED BY column‑ref‑list ]

Vertica 会从查询结果创建一个表,并向其中加载结果集。例如:

=> CREATE TABLE cust_basic_profile AS SELECT
     customer_key, customer_gender, customer_age, marital_status, annual_income, occupation
     FROM customer_dimension WHERE customer_age>18 AND customer_gender !='';
CREATE TABLE
=> SELECT customer_age, annual_income, occupation FROM cust_basic_profile
     WHERE customer_age > 23 ORDER BY customer_age;
 customer_age | annual_income |     occupation
--------------+---------------+--------------------
           24 |        469210 | Hairdresser
           24 |        140833 | Butler
           24 |        558867 | Lumberjack
           24 |        529117 | Mechanic
           24 |        322062 | Acrobat
           24 |        213734 | Writer
           ...

AS 子句选项

可以使用以下一个或两个选项来限定 AS 子句:

  • LABEL 提示,标识用于分析和调试的语句

  • AT epoch 子句,用于指定查询返回历史数据

标记 AS 子句

可以在 AS 子句中的两个位置嵌入 LABEL 提示:

  • 紧跟在关键字 AS 之后:

    CREATE TABLE myTable AS /*+LABEL myLabel*/...
    
  • SELECT 语句中:

    CREATE TABLE myTable AS SELECT /*+LABEL myLabel*/
    

如果 AS 子句在两个位置均包含 LABEL 提示,则第一个标签具有优先权。

加载历史数据

可以使用 AT epoch 子句限定 CREATE TABLE AS 查询,以指定查询返回历史数据,其中 epoch 是以下值之一:

  • EPOCH LATEST:返回数据直到当前时期(但不包括当前时期)。结果集包括来自最新提交的 DML 事务的数据。

  • EPOCH integer:返回数据直到 integer 指定的时期(包括该指定时期)。

  • TIME 'timestamp':从 timestamp 指定的时期返回数据。

有关 Vertica 如何使用时期的详细信息,请参阅时期

有关详细信息,请参阅历史查询

零宽度列处理

如果查询返回零宽度列,Vertica 会自动将其转换为 VARCHAR(80) 列。例如:

要求和限制

  • 如果从查询创建临时表,则必须指定 ON COMMIT PRESERVE ROWS 才能向该表中加载结果集。否则,Vertica 会创建一个空表。

  • 如果查询输出含有除简单列以外的表达式,例如常量或函数,则必须为该表达式指定别名,或在列名列表中列出所有列。

  • 不能将 CREATE TABLE AS SELECT 与返回复杂类型值的 SELECT 一起使用。但是,可以使用 CREATE TABLE LIKE

另请参阅