Postgresql
Postgresql csv to db 翻譯外鍵
我正在嘗試將數據從 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;