如何将SQL Server的PRICE表迁移至PostgreSQL并正确创建衍生列?
解决SQL Server PRICE表迁移至PostgreSQL及衍生列创建问题
一、正确迁移SQL Server表结构到PostgreSQL
SQL Server中的列名包含特殊字符(括号),PostgreSQL支持这类列名但需用双引号包裹,不过更推荐使用无特殊字符的规范列名,避免后续操作繁琐。
1. 保留原列名的建表语句
CREATE TABLE PRICE ( ISIN varchar(50) NOT NULL, Nemo varchar(50) NOT NULL, "Month(t)" int NOT NULL, "Month(t-1)" int NOT NULL, "Month(t-2)" int NOT NULL );
注意:操作这类带特殊字符的列时,必须用双引号包裹列名,例如SELECT "Month(t)" FROM PRICE;。
2. 使用规范列名的建表语句(推荐)
CREATE TABLE PRICE ( isin varchar(50) NOT NULL, nemo varchar(50) NOT NULL, month_t int NOT NULL, month_t_minus_1 int NOT NULL, month_t_minus_2 int NOT NULL );
该命名方式符合PostgreSQL习惯,无需额外引号,更易维护。
二、正确创建衍生列
你之前的报错核心是重复使用Month作为列名,每个列必须有唯一名称。另外,衍生列依赖已有列计算,需先定义基础列,再生成衍生列。
假设以month_t为基础列,自动生成month_t_minus_1(month_t - 1)和month_t_minus_2(month_t - 2),正确建表语句如下:
CREATE TABLE PRICE ( isin varchar(50) NOT NULL, nemo varchar(50) NOT NULL, month_t int NOT NULL, month_t_minus_1 int GENERATED ALWAYS AS (month_t - 1) STORED, month_t_minus_2 int GENERATED ALWAYS AS (month_t - 2) STORED );
GENERATED ALWAYS AS (...) STORED表示衍生列的值会自动计算并存储,无需手动插入或更新。- 衍生列的列名必须唯一,且计算逻辑依赖已提前定义的列(此处为
month_t)。
若业务逻辑有其他依赖关系,只需调整衍生列的计算表达式即可,确保列名唯一、表达式中的列已定义。
三、数据迁移建议
表结构创建完成后,可通过以下方式迁移数据:
- 用工具将SQL Server数据导出为CSV,再用PostgreSQL的
COPY命令导入:COPY PRICE (isin, nemo, month_t, month_t_minus_1, month_t_minus_2) FROM '/path/to/price_data.csv' DELIMITER ',' CSV HEADER; - 若使用衍生列,只需导入基础列(如
isin、nemo、month_t),衍生列的值会自动生成。
内容的提问来源于stack exchange,提问作者Noobmaster
相关产品推荐
相关产品推荐

