删除表列

ALTER TABLE...DROP COLUMN 会删除指定的表列以及与已删除的列对应的 ROS 容器:

ALTER TABLE [schema.]table DROP [ COLUMN ] [IF EXISTS] column [CASCADE | RESTRICT]

删除操作完成后,将恢复自当前时期起备份的数据,但不包含列。从当前时期之前的备份恢复的数据将重新添加表列。由于删除操作会从表中物理清除对象存储和编录定义(表历史记录),AT EPOCH(历史)查询对于已删除的列不返回任何内容。

更改的表保留其对象 ID。

限制

  • 不能删除或更改主键列或参与表分区子句的列。

  • 不能删除任何投影排序顺序中的第一列,或参与投影分段表达式的列。

  • 在企业模式下,所有节点必须都处于启动状态。此限制不适用于 Eon 模式。

  • 不能删除与访问策略关联的列。尝试删除可能会导致以下错误:
    ERROR 6482: Failed to parse Access Policies for table "t1"

使用 CASCADE 强制删除

如果要删除的表列具有依赖项,则必须使用 CASCADE 选项来限定 DROP COLUMN 子句。例如,目标列可能会按投影排序顺序进行指定。在这种情况和其他情况下,DROP COLUMN...CASCADE 将通过重组编录定义或删除投影来处理依赖项。在所有情况下,CASCADE 将执行删除列所需的最低水平的重组。

使用 CASCADE 删除具有以下依赖项的列:

删除作为默认值引用的列

您可能要删除被另一列作为其默认值引用的表列。例如,下表定义为具有两个列 ab,其中 b 将从列 a 获取其默认值。

=> CREATE TABLE x (a int) UNSEGMENTED ALL NODES;
CREATE TABLE
=> ALTER TABLE x ADD COLUMN b int DEFAULT a;
ALTER TABLE

这种情况下,删除列 a 需要执行以下过程:

  1. 通过 ALTER COLUMN..DROP DEFAULT 移除默认依赖项:

    => ALTER TABLE x ALTER COLUMN b DROP DEFAULT;
    
  2. 如果以下条件中的一条或两条为 true,则为目标表创建替换超投影:

    • 目标列为表的第一个排序顺序列。如果表没有显式排序顺序,则默认表排序顺序将第一个表列指定为第一个排序顺序列。在这种情况下,新的超投影必须指定排除目标列的排序顺序。

    • 如果将表分段,则在分段表达式中指定目标列。在这种情况下,新的超投影必须指定排除目标列的分段表达式。

    假定上一个示例中表 x 具有默认排序顺序 (a,b)。由于列 a 为该表的第一个排序顺序列,因此必须创建对列 b 进行排序的替换超投影:

    => CREATE PROJECTION x_p1 as select * FROM x ORDER BY b UNSEGMENTED ALL NODES;
    
  3. 运行 START_REFRESH

    
    => SELECT START_REFRESH();
                  START_REFRESH
    ----------------------------------------
     Starting refresh background process.
    
    (1 row)
    
  4. 运行 MAKE_AHM_NOW

    => SELECT MAKE_AHM_NOW();
             MAKE_AHM_NOW
    -------------------------------
     AHM set (New AHM Epoch: 1231)
    (1 row)
    
  5. 删除列:

    => 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;