Amazon Redshift
数据库开发人员指南 (API Version 2012-12-01)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

ALTER TABLE

更改数据库表的定义。此命令更新 CREATE TABLE 设置的值和属性。

注意

ALTER TABLE 锁定表以便执行读写操作,直到 ALTER TABLE 操作完成。

语法

ALTER TABLE table_name { ADD table_constraint | DROP CONSTRAINT constraint_name [ RESTRICT | CASCADE ] | OWNER TO new_owner | RENAME TO new_name | RENAME COLUMN column_name TO new_name | ADD [ COLUMN ] column_name column_type [ DEFAULT default_expr ] [ ENCODE encoding ] [ NOT NULL | NULL ] | DROP [ COLUMN ] column_name [ RESTRICT | CASCADE ] } 其中 table_constraint 为:[ CONSTRAINT constraint_name ] { UNIQUE ( column_name [, ... ] ) | PRIMARY KEY ( column_name [, ... ] ) | FOREIGN KEY (column_name [, ... ] ) REFERENCES reftable [ ( refcolumn ) ]} 以下选项仅适用于外部表:SET LOCATION { 's3://bucket/folder/' | 's3://bucket/manifest_file' } | SET FILE FORMAT format | SET TABLE PROPERTIES ('property_name'='property_value') | PARTITION ( partition_column=partition_value [, ...] ) SET LOCATION { 's3://bucket/folder' |'s3://bucket/manifest_file' } | ADD PARTITION [IF NOT EXISTS]( partition_column=partition_value [, ...] ) LOCATION { 's3://bucket/folder' |'s3://bucket/manifest_file' } | DROP PARTITION ( partition_column=partition_value [, ...] ) 

参数

table_name

要修改的表的名称。只指定表的名称,或者通过格式 schema_name.table_name 使用特定架构。外部表必须通过一个外部架构名称进行限定。如果您使用 ALTER TABLE 语句重命名视图或更改其所有者,您还可以指定视图名称。表名称的最大长度为 127 个字节;更长的名称将被截断为 127 个字节。您可以使用 UTF-8 多字节字符,每个字符最多为四个字节。有关有效名称的更多信息,请参阅名称和标识符

ADD table_constraint

用于将指定约束添加到表的子句。有关有效 table_constraint 值的描述,请参阅 CREATE TABLE

注意

您不能将主键约束添加到可为空的列。如果列最初是使用 NOT NULL 约束创建的,您可以添加主键约束。

DROP CONSTRAINT constraint_name

用于从表中删除指定约束的子句。要删除约束,请指定约束名称而不是约束类型。要查看表约束名称,请运行以下查询。

select constraint_name, constraint_type from information_schema.table_constraints;
RESTRICT

用于仅删除指定约束的子句。RESTRICT 是 DROP CONSTRAINT 的一个选项。RESTRICT 不能与 CASCADE 一起使用。

CASCADE

用于删除指定约束和依赖于该约束的任何内容的子句。CASCADE 是 DROP CONSTRAINT 的选项。CASCADE 不能与 RESTRICT 一起使用。

OWNER TO new_owner

用于将表 (或视图) 的所有者更改为 new_owner 值的子句。

RENAME TO new_name

用于将表 (或视图) 重命名为 new_name 中指定的值的子句。表名称的最大长度为 127 个字符;更长的名称将被截断为 127 个字节。

您不能将永久表重命名为以“#”开头的表。名称以“#”开头的表是临时表。

RENAME COLUMN column_name TO new_name

用于将列重命名为 new_name 中指定的值的子句。列名称的最大长度为 127 个字节;更长的名称将被截断为 127 个字节。有关有效名称的更多信息,请参阅名称和标识符

ADD [ COLUMN ] column_name

用于将具有指定名称的列添加到表的子句。您在每个 ALTER TABLE 语句中只能修改一列。

您无法添加用作表的分配键 (DISTKEY) 或排序键 (SORTKEY) 的列。

您不能使用 ALTER TABLE ADD COLUMN 命令修改以下表和列属性:

  • UNIQUE

  • PRIMARY KEY

  • REFERENCES(外键)

  • IDENTITY

列名称的最大长度为 127 个字节;更长的名称将被截断为 127 个字节。可在单个表中定义的列的最大数目为 1,600。

column_type

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

  • SMALLINT (INT2)

  • INTEGER (INT, INT4)

  • BIGINT (INT8)

  • DECIMAL (NUMERIC)

  • REAL (FLOAT4)

  • DOUBLE PRECISION (FLOAT8)

  • BOOLEAN (BOOL)

  • CHAR (CHARACTER)

  • VARCHAR (CHARACTER VARYING)

  • DATE

  • TIMESTAMP

DEFAULT default_expr

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

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

如果 COPY 操作在具有 DEFAULT 值和 NOT NULL 约束的列上遇到空字段,则 COPY 命令将插入 default_expr 值。

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

NOT NULL | NULL

NOT NULL 列不允许包含 null 值。NULL(默认值)指定列接受 null 值。

DROP [ COLUMN ] column_name

要从表中删除的列的名称。

您无法删除用作表的分配键 (DISTKEY) 或排序键 (SORTKEY) 的列。如果列具有任何从属对象,例如视图、主键、外键或 UNIQUE 限制,则 DROP COLUMN 的默认行为是 RESTRICT。

RESTRICT

在与 DROP COLUMN 配合使用时,RESTRICT 意味着,如果删除引用该列的已定义视图,或者外键引用了该列,或者该列参与某个多部分键,则不删除该列。RESTRICT 不能与 CASCADE 一起使用。

CASCADE

在与 DROP COLUMN 配合使用时,删除指定的列以及依赖该列的任何内容。CASCADE 不能与 RESTRICT 一起使用。

以下选项仅适用于外部表。

SET LOCATION { 's3://bucket/folder/' | 's3://bucket/manifest_file' }

包含数据文件的 Amazon S3 文件夹的路径或包含 Amazon S3 对象路径列表的清单文件。存储桶必须与 Amazon Redshift 集群位于同一区域。有关受支持的区域的列表,请参阅“Amazon Redshift Spectrum 注意事项”。有关使用清单文件的更多信息,请参阅 CREATE EXTERNAL TABLE 参考中的 LOCATION

SET FILE FORMAT format

外部数据文件的文件格式。

有效格式如下所示:

  • AVRO

  • PARQUET

  • RCFILE

  • SEQUENCEFILE

  • TEXTFILE

SET TABLE PROPERTIES ( 'property_name'='property_value')

用于设置外部表的表属性表定义的子句。

注意

表属性区分大小写。

'numRows'='row_count'

用于为表定义设置 numRows 值的属性。要明确更新外部表的统计数据,请设置 numRows 属性来指示表的大小。Amazon Redshift 不分析外部表来生成表统计数据,查询优化程序会使用这些统计数据来生成查询计划。如果没有为外部表设置表统计数据,则 Amazon Redshift 假设外部表是较大的表,本地表是较小的表,以此来生成查询执行计划。

'skip.header.line.count'='line_count'

用于设置在每个源文件开头要跳过的行数的属性。

PARTITION ( partition_column=partition_value [, ...] SET LOCATION { 's3://bucket/folder' | 's3://bucket/manifest_file' }

用于为一个或多个分区列设置新位置的子句。

ADD PARTITION [ IF NOT EXISTS ] ( partition_column=partition_value [, ...] ) LOCATION { 's3://bucket/folder' | 's3://bucket/manifest_file' }

用于添加分区的子句。一个 ALTER TABLE 语句中只能添加一个分区。

IF NOT EXISTS 子句指示,如果指定的分区已存在,则该命令不应进行任何更改,并返回一条指示分区存在的消息,而不是以错误终止。此子句在编写脚本时很有用,可使脚本在 ALTER TABLE 尝试添加已存在的分区时不会失败。

DROP PARTITION (partition_column=partition_value [, ...] )

用于删除指定分区的子句。删除分区只会更改外部表元数据。Amazon S3 上的数据不受影响。

本页内容: