删除表列
ALTER TABLE...DROP COLUMN 会删除指定的表列以及与已删除的列对应的 ROS 容器:
ALTER TABLE [schema.]table DROP [ COLUMN ] [IF EXISTS] column [CASCADE | RESTRICT]
删除操作完成后,将恢复自当前时期起备份的数据,但不包含列。从当前时期之前的备份恢复的数据将重新添加表列。由于删除操作会从表中物理清除对象存储和编录定义(表历史记录),AT EPOCH(历史)查询对于已删除的列不返回任何内容。
更改的表保留其对象 ID。
注意
删除列操作可能会比较快,因为这些编录级别的更改无需数据重组,因此 Vertica 可以快速回收磁盘存储空间。限制
-
不能删除或更改主键列或参与表分区子句的列。
-
不能删除任何投影排序顺序中的第一列,或参与投影分段表达式的列。
-
在企业模式下,所有节点必须都处于启动状态。此限制不适用于 Eon 模式。
-
不能删除与访问策略关联的列。尝试删除可能会导致以下错误:
ERROR 6482: Failed to parse Access Policies for table "t1"
使用 CASCADE 强制删除
如果要删除的表列具有依赖项,则必须使用 CASCADE 选项来限定 DROP COLUMN 子句。例如,目标列可能会按投影排序顺序进行指定。在这种情况和其他情况下,DROP COLUMN...CASCADE 将通过重组编录定义或删除投影来处理依赖项。在所有情况下,CASCADE 将执行删除列所需的最低水平的重组。
使用 CASCADE 删除具有以下依赖项的列:
删除作为默认值引用的列
您可能要删除被另一列作为其默认值引用的表列。例如,下表定义为具有两个列 a
和 b
,其中 b
将从列 a
获取其默认值。
=> CREATE TABLE x (a int) UNSEGMENTED ALL NODES;
CREATE TABLE
=> ALTER TABLE x ADD COLUMN b int DEFAULT a;
ALTER TABLE
这种情况下,删除列 a
需要执行以下过程:
-
通过 ALTER COLUMN..DROP DEFAULT 移除默认依赖项:
=> ALTER TABLE x ALTER COLUMN b DROP DEFAULT;
-
如果以下条件中的一条或两条为 true,则为目标表创建替换超投影:
-
目标列为表的第一个排序顺序列。如果表没有显式排序顺序,则默认表排序顺序将第一个表列指定为第一个排序顺序列。在这种情况下,新的超投影必须指定排除目标列的排序顺序。
-
如果将表分段,则在分段表达式中指定目标列。在这种情况下,新的超投影必须指定排除目标列的分段表达式。
假定上一个示例中表
x
具有默认排序顺序 (a,b)。由于列a
为该表的第一个排序顺序列,因此必须创建对列b
进行排序的替换超投影:=> CREATE PROJECTION x_p1 as select * FROM x ORDER BY b UNSEGMENTED ALL NODES;
-
-
运行
START_REFRESH
:=> SELECT START_REFRESH(); START_REFRESH ---------------------------------------- Starting refresh background process. (1 row)
-
运行 MAKE_AHM_NOW:
=> SELECT MAKE_AHM_NOW(); MAKE_AHM_NOW ------------------------------- AHM set (New AHM Epoch: 1231) (1 row)
-
删除列:
=> ALTER TABLE x DROP COLUMN a CASCADE;
Vertica 将实施 CASCADE 指令,如下所示:
-
删除表
x
的原始超投影 (x_super
)。 -
通过删除列
a
更新替换超投影x_p1
。
示例
下面的一系列命令成功删除了 BYTEA 数据类型列:
=> CREATE TABLE t (x BYTEA(65000), y BYTEA, z BYTEA(1));
CREATE TABLE
=> ALTER TABLE t DROP COLUMN y;
ALTER TABLE
=> SELECT y FROM t;
ERROR 2624: Column "y" does not exist
=> ALTER TABLE t DROP COLUMN x RESTRICT;
ALTER TABLE
=> SELECT x FROM t;
ERROR 2624: Column "x" does not exist
=> SELECT * FROM t;
z
---
(0 rows)
=> DROP TABLE t CASCADE;
DROP TABLE
下面的一系列命令尝试删除 FLOAT(8) 列,但失败,因为没有足够的投影来维持 K-safety。
=> CREATE TABLE t (x FLOAT(8),y FLOAT(08));
CREATE TABLE
=> ALTER TABLE t DROP COLUMN y RESTRICT;
ALTER TABLE
=> SELECT y FROM t;
ERROR 2624: Column "y" does not exist
=> ALTER TABLE t DROP x CASCADE;
ROLLBACK 2409: Cannot drop any more columns in t
=> DROP TABLE t CASCADE;