使用列数据转换
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,请完成以下步骤:
-
添加一个新列供临时使用。为该列分配 NUMERIC 数据类型,并从现有 price 列中派生其默认值。
添加一个新列供临时使用
-
将列
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)
-
使用 ALTER TABLE 从新列
temp_price
中删除默认表达式。Vertica 会保留存储在此列中的值:=> ALTER TABLE sales ALTER COLUMN temp_price DROP DEFAULT; ALTER TABLE
删除原始 price 列
删除无关的 price
列。在这样做之前,必须先推进
AHM 以清除会阻止删除操作的历史数据:
-
推进 AHM:
=> SELECT MAKE_AHM_NOW(); MAKE_AHM_NOW ------------------------------- AHM set (New AHM Epoch: 6354) (1 row)
-
删除原始 price 列:
=> ALTER TABLE sales DROP COLUMN price CASCADE; ALTER COLUMN
将新列重命名为原始列
现在可以将 temp_price
列重命名为 price
:
-
使用
ALTER TABLE
重命名列:=> ALTER TABLE sales RENAME COLUMN temp_price to price;
-
再次查询 sales 表:
=> SELECT * FROM sales; id | price ----+-------- 1 | 50.00 2 | 100.00 (2 rows)