使用列数据转换

Vertica 通过禁止对表列进行某些数据转换来符合 SQL 标准。但是,当从非 SQL 数据库转换数据时,有时需要绕过此限制。以下示例描述了一种这样的解决方法,使用下表:

=> CREATE TABLE sales(id INT, price VARCHAR) UNSEGMENTED ALL NODES;
CREATE TABLE
=> INSERT INTO sales VALUES (1, '$50.00');
 OUTPUT
--------
      1
(1 row)

=> INSERT INTO sales VALUES (2, '$100.00');
 OUTPUT
--------
      1
(1 row)

=> COMMIT;
COMMIT
=> SELECT * FROM SALES;
 id |  price
----+---------
  1 | $50.00
  2 | $100.00
(2 rows)

要将 price 列的现有数据类型从 VARCHAR 转换为 NUMERIC,请完成以下步骤:

  1. 添加一个新列供临时使用。为该列分配 NUMERIC 数据类型,并从现有 price 列中派生其默认值。

  2. 删除原始 price 列

  3. 将新列重命名为原始列

添加一个新列供临时使用

  1. 将列 temp_price 添加到表 sales。可以暂时使用新列,将其数据类型设置为所需的数据类型 (NUMERIC),并从 price 列中派生其默认值。将新列的默认值转换为 NUMERIC 数据类型并查询该表:

    => ALTER TABLE sales ADD COLUMN temp_price NUMERIC(10,2) DEFAULT
    SUBSTR(sales.price, 2)::NUMERIC;
    ALTER TABLE
    
    => SELECT * FROM SALES;
     id |  price  | temp_price
    ----+---------+------------
      1 | $50.00  |      50.00
      2 | $100.00 |     100.00
    (2 rows)
    
  2. 使用 ALTER TABLE 从新列 temp_price 中删除默认表达式。Vertica 会保留存储在此列中的值:

    => ALTER TABLE sales ALTER COLUMN temp_price DROP DEFAULT;
    ALTER TABLE
    

删除原始 price 列

删除无关的 price 列。在这样做之前,必须先推进 AHM 以清除会阻止删除操作的历史数据:

  1. 推进 AHM:

    => SELECT MAKE_AHM_NOW();
             MAKE_AHM_NOW
    -------------------------------
     AHM set (New AHM Epoch: 6354)
    (1 row)
    
  2. 删除原始 price 列:

    => ALTER TABLE sales DROP COLUMN price CASCADE;
    ALTER COLUMN
    

将新列重命名为原始列

现在可以将 temp_price 列重命名为 price

  1. 使用 ALTER TABLE 重命名列:

    => ALTER TABLE sales RENAME COLUMN temp_price to price;
    
  2. 再次查询 sales 表:

    => SELECT * FROM sales;
     id | price
    ----+--------
      1 |  50.00
      2 | 100.00
    (2 rows)