您可以通过以下两种方式从其他表创建一个表:
重要
还可以使用 Vertica 函数COPY_TABLE
将一个表复制到另一个表。
您可以通过以下两种方式从其他表创建一个表:
COPY_TABLE
将一个表复制到另一个表。
可以使用带有 LIKE
子句的
CREATE TABLE
从现有表创建一个表:
CREATE TABLE [schema.]table-name LIKE [schema.]existing-table
[ {INCLUDING | EXCLUDING} PROJECTIONS ]
[ {INCLUDE | EXCLUDE} [SCHEMA] PRIVILEGES ]
使用 LIKE
创建表会复制源表定义以及与其关联的任何存储策略。它不会复制列上的表数据或表达式。
CREATE TABLE...LIKE
会复制所有表约束,但以下情况除外:
外键约束
从序列获取值的任何列,包括 IDENTITY
和 AUTO_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 PROJECTIONS
或 EXCLUDING PROJECTIONS
限定 LIKE
子句,指定是否从源表中复制投影:
EXCLUDING PROJECTIONS
(默认值):不从源表复制投影。
INCLUDING PROJECTIONS
:从源表复制当前投影。Vertica 会根据 Vertica 命名约定命名新投影,以避免与现有对象发生名称冲突。
可以为新表指定架构权限的默认继承:
EXCLUDE [SCHEMA] PRIVILEGES
(默认)禁用从架构继承权限
INCLUDE [SCHEMA] PRIVILEGES
为表授予向其架构授予的相同权限
有关详细信息,请参阅设置表和视图的权限继承。
对于源表存在以下限制:
不能具有过期投影。
不能为临时表。
创建表 states
:
=> CREATE TABLE states (
state char(2) NOT NULL, bird varchar(20), tree varchar (20), tax float, stateDate char (20))
PARTITION BY state;
向表中填充数据:
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');
查看表内容:
=> 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
创建示例投影并刷新:
=> CREATE PROJECTION states_p AS SELECT state FROM states;
=> SELECT START_REFRESH();
创建一个类似于 states
表的表并包括其投影:
=> CREATE TABLE newstates LIKE states INCLUDING PROJECTIONS;
查看这两个表的投影。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 | |
查看表 newstates
,它显示从 states
复制的列:
=> SELECT * FROM newstates;
state | bird | tree | tax | stateDate
-------+------+------+-----+-----------
(0 rows)
使用 CREATE TABLE...LIKE
语句时,系统也会复制与表关联的存储策略对象。添加到新表的数据会使用与源表相同的标记存储位置,除非您更改了存储策略。有关详细信息,请参阅处理存储位置。
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 子句:
LABEL 提示,标识用于分析和调试的语句
AT epoch 子句,用于指定查询返回历史数据
可以在 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) 列。例如:
=> CREATE TABLE example AS SELECT '' AS X;
CREATE TABLE
=> SELECT EXPORT_TABLES ('', 'example');
EXPORT_TABLES
----------------------------------------------------------
CREATE TEMPORARY TABLE public.example
(
X varchar(80)
);
如果从查询创建临时表,则必须指定 ON COMMIT PRESERVE ROWS 才能向该表中加载结果集。否则,Vertica 会创建一个空表。
如果查询输出含有除简单列以外的表达式,例如常量或函数,则必须为该表达式指定别名,或在列名列表中列出所有列。
不能将 CREATE TABLE AS SELECT 与返回复杂类型值的 SELECT 一起使用。但是,可以使用 CREATE TABLE LIKE。