如何将多对多关联的Excel数据转换并导入PostgreSQL?
哈哈,这个问题我之前帮好几个开发者解决过!你的场景应该是Excel里单条书籍记录对应多个用分隔符拼在一起的分类ID,需要拆成每行一个独立的书籍-分类关联对吧?下面给你三个从易到难的实用方案,3万条数据完全hold住:
解决多对多关联数据导入PostgreSQL的几种实用方法
方案1:用Excel自带Power Query拆分(零代码,适合非开发人员)
这是最省心的方法,不用写任何代码,亲测处理3万条数据毫无压力:
- 打开你的Excel文件,选中包含表头的全部数据区域
- 点击「数据」选项卡 → 「从表格/区域」(弹出提示时勾选「我的表格有标题」)
- 在Power Query编辑器里,选中
id_cat列,点击「转换」→ 「拆分列」→ 选择你实际用的分隔符(比如逗号、分号) - 拆分后会生成
id_cat.1、id_cat.2...等多列,选中所有这些分类列,右键 → 「逆透视列」→ 选择「逆透视其他列」 - 此时会得到三列:
id_b、「属性」(可以直接删除)、「值」(这就是拆分后的单个分类ID),把「值」列重命名为id_cat - 最后点击「关闭并上载」,就能得到每行一个关联的表格,直接保存为CSV格式即可导入PostgreSQL
方案2:用Python脚本批量处理(灵活高效,适合开发人员)
如果你会点Python,这个方法速度最快,3万条数据几秒钟就能搞定:
- 先安装依赖包:
pip install pandas openpyxl - 写一段极简脚本(把路径和分隔符换成你自己的):
import pandas as pd # 读取Excel文件 df = pd.read_excel("你的书籍分类文件.xlsx") # 拆分分类ID列,这里的sep换成你实际用的分隔符(比如","或";") df = df.assign(id_cat=df['id_cat'].str.split(',')).explode('id_cat') # 清理分类ID前后可能存在的空格 df['id_cat'] = df['id_cat'].str.strip() # 保存为适合PostgreSQL导入的CSV文件 df.to_csv("拆分后的书籍分类关联.csv", index=False)
- 运行脚本后得到的CSV就是标准的每行一个
id_b+id_cat格式,直接导入即可
方案3:导入PostgreSQL后再拆分(适合已上传原始数据的情况)
如果你已经把未拆分的Excel数据导入了PostgreSQL临时表(比如叫temp_book_category),可以直接用SQL完成拆分:
-- 先创建目标关联表(如果还没建) CREATE TABLE IF NOT EXISTS book_category ( id_b INT, id_cat INT, PRIMARY KEY (id_b, id_cat) -- 可选,防止重复关联数据 ); -- 拆分临时表数据并插入到目标表,分隔符换成你实际的 INSERT INTO book_category (id_b, id_cat) SELECT id_b, UNNEST(string_to_array(id_cat, ','))::INT -- 把逗号换成你的分隔符 FROM temp_book_category -- 可选:过滤空的分类ID WHERE id_cat IS NOT NULL AND id_cat != '';
导入PostgreSQL的小技巧
不管用哪种方法得到拆分后的CSV,推荐用PostgreSQL的COPY命令导入,速度比GUI工具快N倍:
-- 服务器本地文件用COPY COPY book_category (id_b, id_cat) FROM '/服务器上的CSV文件路径.csv' DELIMITER ',' CSV HEADER; -- 本地文件用psql的\copy命令(不需要服务器权限) \copy book_category (id_b, id_cat) FROM '你的本地CSV路径.csv' DELIMITER ',' CSV HEADER;
内容的提问来源于stack exchange,提问作者spaceoddity11




