ALTER TABLE
修改现有表的元数据。所有更改都将自动提交。
语法
ALTER TABLE [[database.]schema.]table {
ADD COLUMN [ IF NOT EXISTS ] column datatype
[ column‑constraint ]
[ ENCODING encoding‑type ]
[ PROJECTIONS (projections-list) | ALL PROJECTIONS ]
| ADD table‑constraint
| ALTER COLUMN column {
ENCODING encoding-type PROJECTIONS (projection-list)
| { SET | DROP } expression }
| ALTER CONSTRAINT constraint‑name { ENABLED | DISABLED }
| DISK_QUOTA { value | SET NULL }
| DROP CONSTRAINT constraint‑name [ CASCADE | RESTRICT ]
| DROP [ COLUMN ] [ IF EXISTS ] column [ CASCADE | RESTRICT ]
| FORCE OUTER integer
| { INCLUDE | EXCLUDE | MATERIALIZE } [ SCHEMA ] PRIVILEGES
| OWNER TO owner
| partition‑clause [ REORGANIZE ]
| REMOVE PARTITIONING
| RENAME [ COLUMN ] name TO new‑name
| RENAME TO new-table-name[,...]
| REORGANIZE
| SET {
ActivePartitionCount { count | DEFAULT }
| IMMUTABLE ROWS
| MERGEOUT { 1 | 0 }
| SCHEMA schema
}
注意
多个 ALTER TABLE 子句不能与同一语句中的其他子句一起指定(请参阅下面的 Exclusive ALTER TABLE 子句)。否则,ALTER TABLE 支持多个以逗号分隔的子句。例如,下面的 ALTER TABLE 语句通过以下两种方式更改 my_table
表:将所有权重新分配给 Joe
;在 UNIQUE b
列上设置 约束:
=> ALTER TABLE my_table OWNER TO Joe,
ADD CONSTRAINT unique_b UNIQUE (b) ENABLED;
参数
-
[database.]schema
数据库和架构。默认架构为
public
。如果指定一个数据库,它必须是当前数据库。-
表
- 要更改的表。
-
ADD COLUMN
- 向表中添加一列,默认情况下会将该列添加到所有超投影中:
ADD COLUMN [IF NOT EXISTS] column datatype [ NULL | NOT NULL ] [ ENCODING encoding‑type] [ PROJECTIONS (projections-list) | ALL PROJECTIONS]
对复杂类型列的限制也适用于通过 ADD COLUMN 添加的列。
如果指定的名称下面已经存在列,则可选的 IF NOT EXISTS 子句会生成一条信息性消息。如果您忽略此选项且列存在,Vertica 会生成 ROLLBACK 错误消息。
您可以使用以下选项之一限定新的列定义:
-
column‑constraint 指定一个列约束,如下所示:
{NULL | NOT NULL} | [ DEFAULT default‑expr ] [ SET USING using‑expr ] } | DEFAULT USING exp}
-
ENCODING 指定列的编码类型。默认设置为 AUTO。
-
PROJECTIONS 将新列添加到此表的一个或多个现有投影中,指定为投影基本名称的逗号分隔列表。Vertica 将该列添加到每个投影的所有伙伴实例。投影列表不能包含具有预聚合数据的投影,例如实时聚合投影;否则,Vertica 将回退 ALTER TABLE 语句。
-
ALL PROJECTIONS 将该列添加到此表的所有投影(不包括具有预聚合数据的投影)中。
-
-
ADD table‑constraint
- 将约束添加到一个没有任何关联投影的表。
-
ALTER COLUMN
- 您可以通过以下两种方式之一更改现有列:
-
在一列上为该表的一个或多个投影设置编码:
ENCODING encoding-type PROJECTIONS (projections-list)
其中 projections-list 是以逗号分隔的投影列表,这些投影将使用新编码进行更新。可以通过以下两种方式指定每个投影:
-
投影基本名称:更新所有共享此基本名称的投影。
-
投影名称:更新指定的投影。如果投影被分段,则所做的更改将传播到所有伙伴实例。
如果其中一个投影不包含目标列,Vertica 将返回一个回退错误。
有关详细信息,请参阅投影列编码。
-
-
设置或删除一列标量数据(包括原始数组)的设置:
SET { DEFAULT expression | USING expression | DEFAULT USING expression | NOT NULL | DATA TYPE datatype }
DROP { DEFAULT | SET USING | DEFAULT USING | NOT NULL }
如果列所属的复杂类型既不是标量类型也不是标量类型数组,则无法更改其数据类型。存在一个例外:在外部表中,您可以将基元列类型更改为复杂类型。
设置 DEFAULT 或 SET USING 表达式对现有列值没有影响。要使用列的 DEFAULT 或 SET USING 表达式刷新列,请按如下方式对其进行更新:
-
SET USING 列:对该表调用 REFRESH_COLUMNS。
-
DEFAULT 列:按如下方式更新该列:
UPDATE table-name SET column-name=DEFAULT;
-
使用 DEFAULT 或 SET USING 更改列会增加磁盘使用率,如果违反表或架构磁盘配额,这可能会导致操作失败。
-
-
ALTER CONSTRAINT
- 指定是否强制执行主键、唯一键和检查约束:
ALTER CONSTRAINT constraint‑name {ENABLED | DISABLED}
DISK_QUOTA
- 以下几项之一:
-
一个字符串,整数后跟支持的单位:K、M、G 或 T。如果新值小于当前使用量,操作将成功,但在使用量降至新配额以下之前,将无法使用更多磁盘空间。
-
SET NULL,用于移除配额。
有关详细信息,请参阅磁盘配额。
-
-
DROP CONSTRAINT
- 从表中删除指定的表约束:
DROP CONSTRAINT constraint-name [CASCADE | RESTRICT]
您可以使用以下选项之一限定 DROP CONSTRAINT:
-
CASCADE:删除其他表中的约束和所有依赖项。
-
RESTRICT:如果存在依赖对象,则不删除约束。与默认行为相同。
删除表约束对引用该表的视图没有影响。
-
-
DROP [COLUMN]
- 删除表中的指定列以及该列的 ROS 容器:
DROP [COLUMN] [IF EXISTS] column [CASCADE | RESTRICT]
您可以使用以下选项之一限定 DROP COLUMN:
-
如果列不存在,IF EXISTS 会生成一条信息性消息。如果您忽略此选项且列不存在,Vertica 会生成 ROLLBACK 错误消息。
-
如果列具有依赖项,则需要 CASCADE。
-
RESTRICT 仅删除给定表中的列。
列所在的表不能是不可变表。
请参阅删除表列。
-
-
FORCE OUTER integer
- 指定是否将表作为内部或外部输入联接到另一个表。有关详细信息,请参阅控制联接输入。
{INCLUDE | EXCLUDE | MATERIALIZE} [SCHEMA] PRIVILEGES
- 指定在默认情况下继承此表的架构权限:
-
EXCLUDE PRIVILEGES(默认)禁止从架构继承权限。
-
INCLUDE PRIVILEGES 将针对表架构授予的相同权限授予视图。
-
MATERIALIZE PRIVILEGES 将授权复制到表并在表上创建一个 GRANT 对象。这将禁用表上的权限继承标志,让您可以:
-
在表级别授予更具体的权限。
-
使用架构级权限作为模板。
-
将表移动到不同的架构。
-
更改架构权限而不影响表。
注意
如果在数据库级别禁用继承的权限,架构权限仍然可以实体化。 -
另请参阅 设置表和视图的权限继承。
-
-
OWNER TO owner
- 更改表所有者。
-
partition‑clause [REORGANIZE]
- 对外部表无效,通过 PARTITION BY 子句对表数据存储进行逻辑划分:
PARTITION BY partition‑expression [ GROUP BY group‑expression ] [ SET ACTIVEPARTITIONCOUNT integer ]
有关详细信息,请参阅分区子句。
如果您使用 REORGANIZE 限定分区子句,并且在以前没有为表指定分区,则 Vertica Tuple Mover 会立即实现分区子句。如果在以前为表指定了分区,则 Tuple Mover 会评估 ROS 存储容器,并根据需要重新组织这些容器,使其符合新的分区子句。
REMOVE PARTITIONING
- 指定要从表定义中移除分区。 Tuple Mover 随后从 ROS 容器中移除现有分区。
-
RENAME [COLUMN]
- 重命名表中的指定列。列所在的表不能是不可变表。
-
RENAME TO
- 重命名一个或多个表:
RENAME TO new‑table‑name[,...]
需要满足以下要求:
-
重命名的表必须与原始表在同一架构中。
-
新的表名 符合标识符中描述的约定。 同一架构中的序列、表、投影、视图和模型中也必须是唯一的。
-
如果指定多个要重命名的表,则源列表和目标列表必须具有相同数量的名称。
-
-
REORGANIZE
- 仅对分区表有效,调用
Tuple Mover,以根据需要重新组织 ROS 存储容器,使其符合表的当前分区子句。ALTER TABLE...REORGANIZE 和 Vertica 元函数PARTITION_TABLE的运行方式相同。
REORGANIZE 也可以限定一个新的分区子句。
SET
- 更改表设置,为以下几项之一:
-
ActivePartitionCount {count | DEFAULT },仅对分区表有效,指定该表有多少个分区处于活动状态,为以下几项之一:
-
count:无符号整数,取代配置参数 ActivePartitionCount。
-
DEFAULT:移除表级活动分区计数。该表从配置参数 ActivePartitionCount 中获取其活动分区计数。
有关用法的详细信息,请参阅活动和非活动分区。
-
-
IMMUTABLE ROWS 通过阻止 DML 操作(如 UPDATE 和 DELETE)来防止更改表行值。表的不可变性一旦设置便无法恢复。
-
MERGEOUT { 1 | 0 } 指定是允许还是禁止合并用来合并此表的投影数据的 ROS 容器。默认情况下,会针对所有表启用合并 (1)。
-
SCHEMA schema-name 将表从其当前架构移动到 schema-name。Vertica 自动将锚定到源表的所有投影移动到目标架构。它还将所有 IDENTITY 和 AUTO_INCREMENT 列移动到目标架构。有关详细信息,请参阅 将表移动到另一个架构
-
特权
非超级用户:对架构的 USAGE 权限,为以下之一:
-
表所有者
-
ALTER 权限
非超级用户还必须具有 SELECT 权限才能启用或禁用 约束强制执行或移除分区。
对于某些操作,非超级用户必须具备以下架构权限:
-
要重命名表:CREATE、USAGE
-
要将表移动到另一个架构:对源架构具有 USAGE 权限,对目标架构具有 CREATE 权限
复杂类型的限制
原生表中使用的复杂类型除了其参考页面上列出的个别类型的限制外,还有一些限制:
-
原生表必须至少有一个基本类型或原生数组(基本类型的一维数组)的列。如果一个 Flex 表有真实的列,它也必须至少有一个满足这个限制的列。
-
复杂类型列不能在 ORDER BY 或 PARTITION BY 子句中使用,也不能用作 FILLER 列。
-
复杂类型列不能有 约束。
-
返回复杂类型的表达式不能用作投影列,并且投影不能按复杂类型的列进行分段或排序。
-
具有复杂类型列的表不能使用 DEFAULT 和 SET USING。
独占 ALTER TABLE 子句
以下 ALTER TABLE 子句不能与其他 ALTER TABLE 子句结合使用:
-
ADD COLUMN
-
DROP COLUMN
-
RENAME COLUMN
-
SET SCHEMA
-
RENAME [TO]
节点关闭限制
仅限企业模式
当一个或多个数据库群集节点关闭时,不支持以下 ALTER TABLE 操作:
-
ALTER COLUMN ...ADD table‑constraint
-
ALTER COLUMN ...SET DATA TYPE
-
ALTER COLUMN ...{ SET DEFAULT | DROP DEFAULT }
-
ALTER COLUMN ...{ SET USING | DROP SET USING }
-
ALTER CONSTRAINT
-
DROP COLUMN
-
DROP CONSTRAINT
预聚合投影的限制
您不能修改实时聚合或 Top-K 投影中包含的锚定表列的元数据。您也不能删除这些列。要进行这些更改,您必须首先删除与之关联的所有实时聚合和 Top-K 投影。
外部表的限制
并不是所有 ALTER TABLE 选项都适用于外部表。例如,您不能向外部表添加列,但可以重命名该表:
=> ALTER TABLE mytable RENAME TO mytable2;
ALTER TABLE
锁定的表
如果操作无法在目标表上获取 O lock,Vertica 将尝试关闭该表上运行的任何内部 tuple mover 会话。如果成功,则可以继续操作。在用户会话中运行的显式 Tuple Mover 操作不会关闭。如果显式 Tuple Mover 操作在表上运行,则该操作仅在 Tuple Mover 操作完成后继续。