CREATE TABLE
在逻辑架构中创建一个表。
语法
使用列定义创建:
CREATE TABLE [ IF NOT EXISTS ] [[database.]schema.]table
( column-definition[,...] [, table-constraint [,...]] )
[ ORDER BY column[,...] ]
[ segmentation-spec ]
[ KSAFE [safety] ]
[ partition-clause]
[ {INCLUDE | EXCLUDE} [SCHEMA] PRIVILEGES ]
[ DISK_QUOTA quota ]
从其他表创建:
CREATE TABLE [ IF NOT EXISTS ] [[database.]schema.]table
{ AS-clause | LIKE-clause }
[ DISK_QUOTA quota ]
AS 子句:
[ ( column-name-list ) ]
[ {INCLUDE | EXCLUDE} [SCHEMA] PRIVILEGES ]
AS [ /*+ LABEL */ ] [ AT {{< codevar >}}epoch{{< /codevar >}} ] query [ ENCODED BY column-ref-list ] [ segmentation-spec ]
LIKE 子句:
LIKE [[database.]schema.]existing-table
[ {INCLUDING | EXCLUDING} PROJECTIONS ]
[ {INCLUDE | EXCLUDE} [SCHEMA] PRIVILEGES ]
参数
IF NOT EXISTS
如果存在同名对象,请不要创建它并继续。如果忽略此选项且对象存在,Vertica 将生成 ROLLBACK 错误消息。在上述两种情况下,如果对象已经存在,则不会创建它。
IF NOT EXISTS
子句适用于以下 SQL 脚本:可在某个对象不存在时创建该对象。请参阅 ON_ERROR_STOP 了解相关信息。
-
[database.]schema
数据库和架构。默认架构为
public
。如果指定一个数据库,它必须是当前数据库。- 表
- 要创建的表的名称,在架构的所有序列、表、投影、视图和模型的名称中必须是唯一的。
- column-definition
- 列名称、数据类型和可选约束。一个表最多可以有 9800 列。表中至少有一列必须是标量类型或原生数组。
- table-constraint
- 表级别约束,与列约束相反。
-
ORDER BY column[,...]
对外部表无效,指定
SELECT
列表中的列,基于该列表对为此表自动创建的超投影进行排序。ORDER BY
子句不能包含限定符ASC
或DESC
。Vertica 始终按升序存储投影数据。如果省略
ORDER BY
子句,Vertica 将使用SELECT
列表顺序作为投影排序顺序。-
segmentation-spec
对外部表无效,指定如何为此表的自动投影分发数据。提供以下子句之一:
-
hash‑segmentation‑clause:指定将数据均匀分段并分布在群集节点上。Vertica 建议对大表进行分段。
-
unsegmented‑clause:指定以创建未分段的投影。
-
-
KSAFE [safety]
对外部表无效,指定为此表创建的 自动投影的 K-safety,其中 k‑num 必须等于或大于系统 K-safety。如果您省略此选项,投影将使用系统 K-safety 水平。
- partition-clause
- 对外部表无效,通过 PARTITION BY 子句对表数据存储进行逻辑划分:
PARTITION BY partition-expression [ GROUP BY group-expression ] [ ACTIVEPARTITIONCOUNT integer ]
- column-name-list
只有从查询 (
AS query
) 创建表时有效,定义映射到查询输出的列名称。如果忽略此列表,Vertica 将使用查询输出列名称。该子句和
ENCODED BY
子句互斥。列名称列表对外部表无效。column-name-list 中的名称必须与查询列的个数相同。
例如:
CREATE TABLE customer_occupations (name, profession) AS SELECT customer_name, occupation FROM customer_dimension;
-
{INCLUDE | EXCLUDE} [SCHEMA] PRIVILEGES
默认继承此表的架构权限:
-
INCLUDE PRIVILEGES 指定在其架构上设置的表继承权限。如果启用了架构权限继承,则这是默认行为。
-
EXCLUDE PRIVILEGES 禁用从架构继承权限。
有关详细信息,请参阅继承的权限。
-
-
AS query
根据查询结果创建并加载一个表,按如下方式指定:
AS [ /*+ LABEL */ ] [ AT {{< codevar >}}epoch{{< /codevar >}} ] query
查询不能包含复杂类型的列。
-
ENCODED BY column-ref-list
该列表中的列来自源表且以逗号分隔,其中每列由以下一个或两个编码选项限定:
-
ACCESSRANK integer
:覆盖列的默认访问等级,对于确定列访问的优先级很有用。请参阅确定列访问速度的优先级。 -
ENCODING encoding-type
: 指定要在列上使用的编码的类型。默认编码类型为“AUTO”。
此选项和 column-name-list 是互斥的。此选项对于外部表无效。
-
-
LIKE existing-table
- 通过复制现有表创建表。您可以使用以下选项之一限定 LIKE 子句:
-
EXCLUDING PROJECTIONS(默认值):不要从源表中复制投影。
-
INCLUDING PROJECTIONS:从新表的源表中复制当前投影。
-
{INCLUDE|EXCLUDE} [SCHEMA] PRIVILEGES:请参阅以上描述)。
-
DISK_QUOTA
配额- 字符串,一个整数,后跟支持的单位:K、M、G 或 T。导致表的使用率超出设置的配额的数据加载、DML 和 ILM 操作失败。有关详细信息,请参阅磁盘配额。
如果未指定,则表没有配额。
特权
超级用户可以设置磁盘配额。
非超级用户:
-
对表架构的 CREATE 权限
-
如果创建包含命名序列的表:
-
对于序列对象的 SELECT 权限
-
对于序列架构的 USAGE 权限
-
-
如果使用 LIKE 子句创建表,则为源表所有者
复杂类型的限制
原生表中使用的复杂类型除了其参考页面上列出的个别类型的限制外,还有一些限制:
-
原生表必须至少有一个基本类型或原生数组(基本类型的一维数组)的列。如果一个 Flex 表有真实的列,它也必须至少有一个满足这个限制的列。
-
复杂类型列不能在 ORDER BY 或 PARTITION BY 子句中使用,也不能用作 FILLER 列。
-
复杂类型列不能有 约束。
-
返回复杂类型的表达式不能用作投影列,并且投影不能按复杂类型的列进行分段或排序。
-
具有复杂类型列的表不能使用 DEFAULT 和 SET USING。
示例
以下示例将在公共架构中创建一个表:
CREATE TABLE public.Premium_Customer
(
ID IDENTITY ,
lname varchar(25),
fname varchar(25),
store_membership_card int
);
以下示例将使用 LIKE 从该表创建一个新表:
=> CREATE TABLE All_Customers LIKE Premium_Customer;
CREATE TABLE
以下示例将使用 AS 子句从一个表中选择要在新表中使用的列:
=> 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
...
以下示例将使用数组列创建一个表:
=> CREATE TABLE orders(
orderkey INT,
custkey INT,
prodkey ARRAY[VARCHAR(10)],
orderprices ARRAY[DECIMAL(12,2)],
orderdate DATE
);
以下示例使用 ROW 复杂类型:
=> CREATE TABLE inventory
(store INT, products ROW(name VARCHAR, code VARCHAR));
以下示例使用配额:
=> CREATE SCHEMA internal DISK_QUOTA '10T';
CREATE SCHEMA
=> CREATE TABLE internal.sales (...) DISK_QUOTA '5T';
CREATE TABLE
=> CREATE TABLE internal.leads (...) DISK_QUOTA '12T';
WARNING 0: Table leads has disk quota greater than its schema internal