Postgresql

Postgresql csv to db 翻譯外鍵

  • December 18, 2014

我正在嘗試將數據從 csv 導入到 postgresql 數據庫。

db 表如下所示:

CREATE TABLE texts(
text_id serial PRIMARY KEY,
topic_id integer REFERENCES topics,
format_id integer REFERENCES formats,
text text
);

內容:1;1;1;範例文本

CREATE TABLE topics(
topic_id serial PRIMARY KEY,
topic varchar(50) NOT NULL
);

內容:1;喜劇

CREATE TABLE formats(
format_id serial PRIMARY KEY,
format varchar(50) NOT NULL
);

內容:1;A5

和一個看起來像這樣的 csv 表:

topic;format;text
comedy;A5;asdlakjsdlahsdasd
love;A6;laksdasdkhjasf

現在我想插入 csv 的內容。如何將 csv 內容(如“格式”)轉換為格式表中的 format_ids?

任何幫助深表感謝。

更新:

創建 tmp 表並插入 csv 很容易。

create table tmp (
   id serial PRIMARY KEY,
   topic_id integer,
   topic varchar(255),
   format_id integer,
   format varchar(255),
   text text
);

copy tmp(topic, format, text) FROM 'test.csv' DELIMITER ';' CSV HEADER;

但是我現在如何獲得正確的 ID 以將它們插入到文本表中?

我看不到您在發布的任何地方引用了 CSV 的內容..(至少在未來的任何編輯之前)。您應該使用 COPY 命令。

http://www.postgresql.org/docs/current/static/sql-copy.html

編輯

由於 Topic 和 Format 表似乎是參照完整性的查找表,因此正確的做法是將值插入這些表中 FIRST .. 然後使用 SELECT.. 插入另一個表中。答案如下:

INSERT INTO topics (topic) SELECT DISTINCT topic FROM tmp;
INSERT INTO formats (format) SELECT DISTINCT format FROM tmp;
INSERT INTO texts (topic_id, format_id, text)
 SELECT b.topic_id, c.format_id, a.text
 FROM tmp a
 JOIN topics b ON a.topic = b.topic
 JOIN formats c ON a.format = c.format;

完成後不要忘記清理。

DROP TABLE tmp;

引用自:https://dba.stackexchange.com/questions/86349