Amazon Redshift
数据库开发人员指南 (API Version 2012-12-01)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

CREATE TABLE

在当前数据库中创建一个新表。此表的所有者为 CREATE TABLE 命令的发布者。

语法

Copy
CREATE [ [LOCAL ] { TEMPORARY | TEMP } ] TABLE [ IF NOT EXISTS ] table_name ( { column_name data_type [column_attributes] [ column_constraints ] | table_constraints | LIKE parent_table [ { INCLUDING | EXCLUDING } DEFAULTS ] } [, ... ] ) [ BACKUP { YES | NO } ] [table_attribute] where column_attributes are: [ DEFAULT default_expr ] [ IDENTITY ( seed, step ) ] [ ENCODE encoding ] [ DISTKEY ] [ SORTKEY ] and column_constraints are: [ { NOT NULL | NULL } ] [ { UNIQUE | PRIMARY KEY } ] [ REFERENCES reftable [ ( refcolumn ) ] ] and table_constraints are: [ UNIQUE ( column_name [, ... ] ) ] [ PRIMARY KEY ( column_name [, ... ] ) ] [ FOREIGN KEY (column_name [, ... ] ) REFERENCES reftable [ ( refcolumn ) ] and table_attributes are: [ DISTSTYLE { EVEN | KEY | ALL } ] [ DISTKEY ( column_name ) ] [ [COMPOUND | INTERLEAVED ] SORTKEY ( column_name [, ...] ) ]

参数

LOCAL

可选。虽然语句中接受此关键字,但它在 Amazon Redshift 中没有任何作用。

TEMPORARY | TEMP

一个关键字,可创建仅在当前会话中可见的临时表。在从中创建表的会话结束时,将自动删除此表。临时表可具有与永久表相同的名称。在特定于会话的单独 schema 中创建临时表。(您无法为此 schema 指定名称。)此临时 schema 将成为搜索路径中的第一个 schema,因此临时表优先于永久表,除非您使用 schema 名称来限定表名以访问永久表。有关 schema 和优先顺序的更多信息,请参阅 search_path

注意

默认情况下,用户有权通过其在 PUBLIC 组中自动获得的成员资格来创建临时表。要拒绝向用户授予此权限,可从 PUBLIC 组撤消 TEMP 权限,然后仅将 TEMP 权限显式授予特定用户或用户组。

IF NOT EXISTS

这个子句指示,如果指定的表已存在,命令应不进行任何更改并返回一条指示表存在的消息,而不是以错误终止。请注意,现有表可能与已创建的表完全不同;命令仅使用表名进行比较。

此子句在编写脚本时很有用,可使脚本在 CREATE TABLE 尝试创建已存在的表时不会失败。

table_name

要创建的表的名称。

重要

如果指定以“#”开始的表名,表将创建为临时表。以下是示例:

Copy
create table #newtable (id int);

表名称的最大长度为 127 个字节;更长的名称将被截断为 127 个字节。您可以使用 UTF-8 多字节字符,每个字符最多为四个字节。Amazon Redshift 强制实施每个群集 9900 个表的限制,包括用户定义的临时表以及 Amazon Redshift 在查询处理或系统维护期间创建的临时表。也可使用数据库名称和 schema 名称来限定表名称。在下面的示例中,tickit 是数据库名称,public 是 schema 名称,而 test 是表名称。

Copy
create table tickit.public.test (c1 int);

如果数据库或 schema 不存在,则不会创建表,并且语句将返回错误。无法在系统数据库 template0template1padb_harvest 中创建表或视图。

如果提供 schema 名称,则在该 schema 中创建新表(假定创建者有权访问 schema)。表名称必须是该 schema 中的唯一名称。如果未指定 schema,则可使用当前数据库 schema 创建表。如果您创建的是临时表,则无法指定 schema 名称,因为特定 schema 中存在临时表。

同一个数据库中可同时存在多个同名的临时表,前提是这些临时表是在单独的会话中创建的,因为这些表将分配给不同的 schema。有关有效名称的更多信息,请参阅名称和标识符

column_name

要在新表中创建的列的名称。列名称的最大长度为 127 个字节;更长的名称将被截断为 127 个字节。您可以使用 UTF-8 多字节字符,每个字符最多为四个字节。可在单个表中定义的列的最大数目为 1,600。有关有效名称的更多信息,请参阅名称和标识符

注意

如果您创建的是“宽表”,请注意,在加载和查询处理期间,不要让列列表超出中间结果的行宽度边界。有关更多信息,请参阅 使用说明

data_type

要创建的列的数据类型。对于 CHAR 和 VARCHAR 列,您可以使用 MAX 关键字而不是声明最大长度。MAX 将最大长度设置为 4096 字节(对于 CHAR)或 65535 字节(对于 VARCHAR)。支持以下数据类型

  • SMALLINT (INT2)

  • INTEGER (INT, INT4)

  • BIGINT (INT8)

  • DECIMAL (NUMERIC)

  • REAL (FLOAT4)

  • DOUBLE PRECISION (FLOAT8)

  • BOOLEAN (BOOL)

  • CHAR (CHARACTER)

  • VARCHAR (CHARACTER VARYING)

  • DATE

  • TIMESTAMP

  • TIMESTAMPTZ

DEFAULT default_expr

一个为列分配默认数据值的子句。default_expr 的数据类型必须匹配列的数据类型。DEFAULT 值必须是无变量的表达式。不允许子查询、对当前表中其他列的交叉引用和用户定义的函数。

default_expr 表达式在未为列指定值的任何 INSERT 操作中使用。如果未指定默认值,则列的默认值为 null。

如果具有定义的列列表的 COPY 操作忽略具有 DEFAULT 值的列,则 COPY 命令将插入 default_expr 的值。

IDENTITY(seed, step)

一个指定列为 IDENTITY 列的子句。IDENTITY 列包含唯一的自动生成的值。IDENTITY 列的数据类型必须为 INT 或 BIGINT。使用 INSERT 语句添加行时,这些值从 seed 值开始,并按照 step 使用 COPY 语句加载表时,IDENTITY 列可能没什么用。使用 COPY 语句时,数据将并行加载并分发到节点切片。为确保身份值唯一,Amazon Redshift 在创建身份值时跳过多个值。因此,身份值是唯一的、顺序的,但不是连续的,并且顺序可能与源文件中的顺序不一致。

ENCODE encoding

列的压缩编码。如果未选择压缩,Amazon Redshift 会自动分配压缩编码,如下所示:

  • 默认情况下,会为临时表中的所有列分配 RAW 压缩。

  • 为定义为排序键的列分配 RAW 压缩。

  • 为定义为 BOOLEAN、REAL 或 DOUBLE PRECISION 数据类型的列分配 RAW 压缩。

  • 为其他列分配 LZO 压缩。

注意

如果您不希望压缩某个列,请显式指定 RAW 编码。

支持以下compression encodings

  • BYTEDICT

  • DELTA

  • DELTA32K

  • LZO

  • MOSTLY8

  • MOSTLY16

  • MOSTLY32

  • RAW (无压缩)

  • RUNLENGTH

  • TEXT255

  • TEXT32K

  • ZSTD

DISTKEY

一个指定列为表的分配键的关键字。一个表中只能有一个列可成为分配键。可在列名后使用 DISTKEY 关键字,也可使用 DISTKEY (column_name) 语法将该关键字用作表定义的一部分。每种方法的效果相同。有关更多信息,请参阅本主题后面的 DISTSTYLE 参数。

SORTKEY

一个指定列为表的排序键的关键字。在数据加载到表中后,将按指定为排序键的一个或多个列对数据进行排序。可在列名后使用 SORTKEY 关键字来指定单列排序键,也可使用 SORTKEY (column_name [, ...]) 语法将一个或多个列指定为表的排序键列。仅使用此语法创建复合排序键。

如果您不指定任何排序键,则不会对表进行排序。您最多可以为每个表定义 400 个 SORTKEY 列。

NOT NULL | NULL

NOT NULL 列不允许包含 null 值。NULL(默认值)指定列接受 null 值。默认情况下,将 IDENTITY 列声明为 NOT NULL。

UNIQUE

一个指定列只能包含唯一值的关键字。唯一表约束的行为与列约束的行为相同,但前者能够跨多个列。要定义唯一表约束,请使用 UNIQUE ( column_name [, ... ] ) 语法。

重要

唯一约束是信息性的,而不由系统强制实施。

PRIMARY KEY

一个指定列为表的主键的关键字。通过使用列定义,只能将一个列定义为主键。要使用多列主键定义表约束,请使用 PRIMARY KEY ( column_name [, ... ] ) 语法。

通过将一个列标识为主键,可提供有关 schema 设计的元数据。主键意味着其他表可将此列集用作行的唯一标识符。可以为一个表指定一个主键,作为列约束或表约束。主键约束指定的列集应不同于为同一表定义的任何唯一约束指定的其他列集。

重要

主键约束仅为信息性的。这些约束不由系统强制实施,而是由计划程序使用。

References reftable [ ( refcolumn ) ]

一个指定外键约束的子句,该外键约束暗示列包含的值必须与被引用表的某个行的被引用列中的值匹配。被引用列应为引用的表中的唯一或主键约束的列。

重要

外键约束仅为信息性的。这些约束不由系统强制实施,而是由计划程序使用。

LIKE parent_table [ { INCLUDING | EXCLUDING } DEFAULTS ]

一个指定现有表的子句,新表自动从该表中复制列名、数据类型和 NOT NULL 约束。新表和父表是分离的,对父表所做的所有更改都不适用于新表。仅在指定 INCLUDING DEFAULTS 的情况下复制已复制列定义的默认表达式。默认行为是排除默认表达式,以便新表的所有列包含 null 默认值。

使用 LIKE 选项创建的表不继承主键约束和外键约束。分配样式、排序键、BACKUP 和 NULL 属性由 LIKE 表继承,但您无法在 CREATE TABLE ... LIKE 语句中显式设置这些属性。

BACKUP { YES | NO }

一个子句,指定表是否应包含在自动和手动群集快照中。对于不会包含关键数据的表(如暂存表),请指定 BACKUP NO 以节省在创建快照并从快照还原时的处理时间,从而减小在 Amazon Simple Storage Service 上占用的存储空间。BACKUP NO 设置不会影响数据到群集内的其他节点的自动复制,因此当发生节点故障时,指定了 BACKUP NO 的表将被还原。默认值为 BACKUP YES。

DISTSTYLE { EVEN | KEY | ALL }

一个定义整个表的数据分配样式的关键字。Amazon Redshift 根据为表指定的分配样式将表行分配给计算节点。

为表选择的分配样式将影响数据库的整体性能。有关更多信息,请参阅 选择数据分配方式。可能的分配样式如下:

  • EVEN:表中的数据在轮询分配中跨群集中的节点均匀分布。行 ID 用来确定分配,并且为每个节点分配的行数大致相同。此分配方法为默认设置。

  • KEY:按 DISTKEY 列中的值分配数据。在您将联接表的联接列设置为分配键时,来自这两个表的联接行将在计算节点上并置。在并置数据时,优化程序可更高效地执行联接。如果您指定 DISTSTYLE KEY,则必须为表指定 DISTKEY 列或者将此列指定为列定义的一部分。有关更多信息,请参阅本主题前面的 DISTKEY 参数。

  • ALL:向每个节点分配整个表的副本。此分配样式可确保任何联接所需的所有行在每个节点上都可用,但这将使存储要求成倍提高,并且会增加表的加载和维护次数。将 ALL 分配样式用于 KEY 分配不适用的某些维度表时会缩短执行时间,但必须针对维护成本来权衡性能改进。

DISTKEY ( column_name )

一个约束,指定要用作表的分配键的列。可在列名后使用 DISTKEY 关键字,也可使用 DISTKEY (column_name) 语法将该关键字用作表定义的一部分。每种方法的效果相同。有关更多信息,请参阅本主题前面的 DISTSTYLE 参数。

[ { COMPOUND | INTERLEAVED } ] SORTKEY ( column_name [,... ] )

为表指定一个或多个排序键。在数据加载到表中后,将按指定为排序键的列对数据进行排序。可在列名后使用 SORTKEY 关键字来指定单列排序键,也可使用 SORTKEY (column_name [ , ... ] ) 语法将一个或多个列指定为表的排序键列。

您可以选择指定 COMPOUND 或 INTERLEAVED 排序样式。默认为 COMPOUND。有关更多信息,请参阅 选择排序键

如果您不指定任何排序键,则默认情况下不会对表进行排序。最多可以为每个表定义 400 个 COMPOUND SORTKEY 列或 8 个 INTERLEAVED SORTKEY 列。

COMPOUND

指定使用由所有列出的列构成的复合键按这些列的列出顺序对数据进行排序。当查询根据排序列的顺序扫描行时,复合排序键最有用。当查询依赖辅助排序列时,使用复合键进行排序所带来的性能好处会减少。您最多可以为每个表定义 400 个 COMPOUND SORTKEY 列。

INTERLEAVED

指定使用交错排序键对数据进行排序。可以为一个交错排序键最多指定 8 个列。

交错排序为排序键中的每个列或列子集提供了相同的权重,以便查询不依赖于排序键中列的顺序。当查询使用一个或多个辅助排序列时,交错排序会大大提高查询性能。交错排序产生的数据加载和 vacuum 操作的开销成本较低。

重要

请勿在具有单调递增属性的列 (例如,身份列、日期或时间戳) 上使用交错排序键。

UNIQUE ( column_name [,...] )

一个约束,指定包含一个或多个表列的组只能包含唯一值。唯一表约束的行为与列约束的行为相同,但前者能够跨多个列。在唯一约束的上下文中,null 值不被视为相同。每个唯一表约束指定的列集必须不同于由为表定义的任何其他唯一键约束或主键约束指定的列集。

重要

唯一约束是信息性的,而不由系统强制实施。

PRIMARY KEY ( column_name [,...] )

一个约束,指定表的一个列或大量列只能包含唯一(不重复)的非 null 值。通过将一个列集标识为主键,也会提供有关 schema 设计的元数据。主键意味着其他表可将此列集用作行的唯一标识符。可以为一个表指定一个主键,作为单个列约束或表约束。主键约束指定的列集应不同于为同一表定义的任何唯一约束指定的其他列集。

重要

主键约束仅为信息性的。这些约束不由系统强制实施,而是由计划程序使用。

FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn ) ]

一个指定外键约束的约束,该约束要求新表的一个或多个列只能包含与被引用表的某个行的被引用列中的值匹配的值。如果忽略 refcolumn,则使用 reftable 的主键。被引用列必须为被引用表中的唯一或主键约束的列。

重要

外键约束仅为信息性的。这些约束不由系统强制实施,而是由计划程序使用。

本页内容: