添加表列

可以使用 ALTER TABLE..ADD COLUMN 将列添加到持久表:

ALTER TABLE
...
ADD COLUMN [IF NOT EXISTS] column datatype
  [column‑constraint]
  [ENCODING encoding‑type]
  [PROJECTIONS (projections‑list) | ALL PROJECTIONS ]

表锁定

当使用 ADD COLUMN 更改表时,Vertica 会对该表采用 O 锁,直到操作完成。该锁可防止 DELETE、UPDATE、INSERT 和 COPY 语句访问表。该锁还会阻止在 SERIALIZABLE 隔离级别发出的 SELECT 语句,直到操作完成。

向表添加列并不会影响 物理架构设计的 K-safety

您可以在节点下线时添加列。

向投影添加新列

向表添加列时,Vertica 会自动将该列添加到该表的 超投影。ADD..COLUMN 子句还可以使用以下选项之一指定将列添加到一个或多个非超投影:

  • PROJECTIONS (projections-list):将新列添加到该表的一个或多个投影,以投影基本名称的逗号分隔列表形式指定。Vertica 会将该列添加到每个投影的所有伙伴实例。投影列表不能包含具有预聚合数据的投影,例如实时聚合投影;否则,Vertica 会回退 ALTER TABLE 语句。

  • ALL PROJECTIONS 会将列添加到该表的所有投影,不包括具有预聚合数据的投影。

例如,store_orders 表有两个投影:超投影 store_orders_super 和用户创建的投影 store_orders_p。以下 ALTER TABLE..ADD COLUMN 语句将列 expected_ship_date 添加到 store_orders 表。由于该语句省略了 PROJECTIONS 选项,因此 Vertica 仅将该列添加到表的超投影:

=> ALTER TABLE public.store_orders ADD COLUMN expected_ship_date date;
ALTER TABLE
=> SELECT projection_column_name, projection_name FROM projection_columns WHERE table_name ILIKE 'store_orders'
     ORDER BY projection_name , projection_column_name;
 projection_column_name |  projection_name
------------------------+--------------------
 order_date             | store_orders_p_b0
 order_no               | store_orders_p_b0
 ship_date              | store_orders_p_b0
 order_date             | store_orders_p_b1
 order_no               | store_orders_p_b1
 ship_date              | store_orders_p_b1
 expected_ship_date     | store_orders_super
 order_date             | store_orders_super
 order_no               | store_orders_super
 ship_date              | store_orders_super
 shipper                | store_orders_super
(11 rows)

以下 ALTER TABLE...ADD COLUMN 语句包括 PROJECTIONS 选项。这指定在添加操作中包含投影 store_orders_p。Vertica 将新列添加到此投影和表的超投影:

=> ALTER TABLE public.store_orders ADD COLUMN delivery_date date PROJECTIONS (store_orders_p);
=> SELECT projection_column_name, projection_name FROM projection_columns WHERE table_name ILIKE 'store_orders'
     ORDER BY projection_name, projection_column_name;
 projection_column_name |  projection_name
------------------------+--------------------
 delivery_date          | store_orders_p_b0
 order_date             | store_orders_p_b0
 order_no               | store_orders_p_b0
 ship_date              | store_orders_p_b0
 delivery_date          | store_orders_p_b1
 order_date             | store_orders_p_b1
 order_no               | store_orders_p_b1
 ship_date              | store_orders_p_b1
 delivery_date          | store_orders_super
 expected_ship_date     | store_orders_super
 order_date             | store_orders_super
 order_no               | store_orders_super
 ship_date              | store_orders_super
 shipper                | store_orders_super
(14 rows)

更新关联的表视图

将新列添加到具有关联视图的表时,系统不会更新视图的结果集,即便该视图使用了通配符 (*) 来表示所有表列。要整合新列,您必须重新创建视图