【问题标题】:Import ONE_2_MANY data from flat CSV file into two PostgreSQL tables将平面 CSV 文件中的 ONE_2_MANY 数据导入两个 PostgreSQL 表
【发布时间】:2016-12-09 09:54:28
【问题描述】:

我有以下 PostgreSQL 架构:

CREATE SEQUENCE user_question_rev_user_question_rev_id_seq
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 1
  CACHE 1;         

CREATE TABLE user_question_rev (
  user_question_rev_id integer NOT NULL DEFAULT nextval('user_question_rev_user_question_rev_id_seq'::regclass),
  email_address character varying(100),
  entry_id integer NOT NULL,
  create_date timestamp without time zone,
  CONSTRAINT user_question_rev_pkey PRIMARY KEY (user_question_rev_id)
);

CREATE SEQUENCE user_question_user_question_id_seq
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 1
  CACHE 1; 

CREATE TABLE user_question (
  user_question_id integer NOT NULL DEFAULT nextval('user_question_user_question_id_seq'::regclass),
  user_question_rev_id integer NOT NULL,
  question text NULL,
  answer text NULL,
  create_date timestamp without time zone,
  CONSTRAINT user_question_pkey PRIMARY KEY (user_question_id),              
  CONSTRAINT user_question_user_question_rev_id_fkey FOREIGN KEY (user_question_rev_id)
    REFERENCES user_question_rev (user_question_rev_id) MATCH SIMPLE
    ON UPDATE NO ACTION ON DELETE NO ACTION
);

另外,我有一个 CSV 文件,其结构如下:

Email Address        |   Question 1  |  Question 2   |  Question 3   |  Entry Id  |  Entry Date
--------------------------------------------------------------------------------------------------------
user1@example.com    |   Answer 1_1  |  Answer 2_1   |  Answer 3_1   |  667       |  2016-12-02 06:15:13
user2@example.com    |   Answer 1_2  |  Answer 2_2   |  Answer 3_2   |  666       |  2016-12-02 05:15:59
user3@example.com    |   Answer 1_3  |  Answer 2_3   |  Answer 3_3   |  665       |  2016-12-01 05:20:22
user4@example.com    |   Answer 1_4  |  Answer 2_4   |  Answer 3_4   |  662       |  2016-11-29 15:16:58
user5@example.com    |   Answer 1_5  |  Answer 2_5   |  Answer 3_5   |  651       |  2016-11-28 16:14:52
user2@example.com    |   Answer 1_22 |  Answer 2_22  |  Answer 3_22  |  681       |  2016-12-03 02:11:01

我需要将此 CSV 文件中的数据加载到上面的 PostgreSQL 架构中。

对于 CSV 中的每条记录,我需要在 user_question_rev 表中创建一个适当的新记录,并在 user_question 表中创建新记录(ONE_2_MANY)并放置在那里:

(CSV) Email Address -> (user_question_rev) email_address
(CSV) Entry Id      -> (user_question_rev) entry_id
(CSV) Entry Date    -> (user_question_rev) create_date

并通过user_question.user_question_rev_id 适当的ONE_2_MANY:

user_question_rev.user_question_rev_id -> user_question.user_question_rev_id
(CSV) Question 1                       -> (user_question) question 
(CSV) Entry Date                       -> (user_question) create_date
(CSV) Question 2                       -> (user_question) question 
(CSV) Entry Date                       -> (user_question) create_date
(CSV) Question 3                       -> (user_question) question 
(CSV) Entry Date                       -> (user_question) create_date

请说明如何使用 PostgreSQL 和 SQL 来完成。

【问题讨论】:

  • 1) 首先将 CSV 读入临时表。 2)使用它来填充 user_question rev 表。 3) 使用 temp JOIN user_question_rev 填充 user_question 表。 (需要user_question_rev表来查找seq)4)删除临时表

标签: sql postgresql csv


【解决方案1】:
  • 使用基于 csv 的结构创建导入表 - 如下所示 - 我建议所有文本类型的列都可以通过这种方式导入而不会出错。 CSV 文件有时包含非常奇怪的值... create table my_import ( Email Address text, Question1 text, Question2 text, Question3 text, EntryId text EntryDate text )
  • 使用 psql + COPY 命令(如果文件在服务器上)或“\copy”(如果文件在本地计算机上)导入 - 请参阅文档
  • 并以您在问题中描述的相同方式从此导入的表中进行选择。只需将您的规则转换为更简单的 SQL 语句即可。在这种情况下,简单性是你的煎熬 :-) 当然不要忘记正确转换为目标类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-21
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多