CSV大量数据导入Valentina Studio及PostgreSQL外键类型不匹配、PowerShell批量导入问题求助
CSV大量数据导入Valentina Studio及PostgreSQL外键类型不匹配、PowerShell批量导入问题求助
兄弟,你的问题我拆成几个实操部分给你讲,都是我踩过的坑,应该能直接解决:
一、外键类型不匹配报错的原因&解决办法
你遇到的invalid input syntax for type uuid "92"报错,根源太明确了:你创建子表的时候,外键列用了UUID REFERENCES类型,但CSV里的外键值是普通整数(比如92)。PostgreSQL会把CSV里的整数当作字符串去尝试转换成UUID格式,这肯定转失败啊!
解决分两种情况选:
- 如果业务不需要UUID,用整数外键更简单:直接修改表结构,把外键列的类型从UUID改成整数(350k数据用
INT足够,怕以后数据爆就用BIGINT)。执行这条SQL就行:
注意!修改前一定要确认父表的主键也是整数类型,不然父子表关联不起来。ALTER TABLE 你的子表名 ALTER COLUMN 外键列名 TYPE INT USING 外键列名::INT; - 如果必须用UUID外键:那你得给CSV里的每个整数对应生成UUID,同时把父表的主键也改成UUID,再一一映射对应值——这个步骤繁琐,非业务强制要求的话不推荐这么干。
二、Valentina Studio导入数据+自动维护外键关联
先把外键类型和CSV数据匹配好,再用Valentina Studio的导入向导:
- 右键目标表→
Import Data→选择你的CSV文件 - 跟着向导走,到列映射步骤时,一定要把CSV里的外键列和表的外键列精准对应
- 只要子表外键列的所有值,都能在父表的主键列里找到匹配项,PostgreSQL会自动维护这个外键关联,根本不用手动创建链接!你之前手动创建是因为要么类型不匹配,要么列没对应对,导致关联没生效。
导入完可以用这条SQL检查有没有不匹配的外键值,有就修正:
SELECT * FROM 子表名 WHERE 外键列名 NOT IN (SELECT 主键列名 FROM 父表名);
三、PowerShell批量导入CSV到PostgreSQL
大数据量别用脚本循环插,直接用PostgreSQL自带的psql命令行工具,速度快到飞起,PowerShell里直接就能调用:
单表导入命令
psql -U 你的数据库用户名 -d 你的数据库名 -c "\copy 你的表名 FROM 'C:\你的CSV文件路径\data.csv' WITH (FORMAT csv, HEADER true, DELIMITER ',', ENCODING 'UTF8');"
HEADER true:表示CSV第一行是列名,没有的话改成HEADER falseDELIMITER ',':CSV的分隔符,是制表符就改成'\t',根据你的文件调整
批量导入文件夹下所有CSV
如果要一次性导入多个CSV,假设CSV文件名和表名完全一致(比如user.csv对应user表),可以用这段PowerShell脚本:
# 先配置你的参数 $dbUser = "你的用户名" $dbName = "你的数据库名" $csvFolder = "C:\存放CSV的文件夹路径" # 遍历所有CSV文件并导入 Get-ChildItem -Path $csvFolder -Filter *.csv | ForEach-Object { $tableName = $_.BaseName # 取CSV文件名(不含后缀)作为表名 $csvPath = $_.FullName # 拼接psql命令并执行 $importCommand = "psql -U $dbUser -d $dbName -c `"\copy $tableName FROM '$csvPath' WITH (FORMAT csv, HEADER true, DELIMITER ',', ENCODING 'UTF8');`"" Invoke-Expression $importCommand Write-Host "✅ 已完成导入:$csvPath → 表 $tableName" }
要是你的CSV文件名和表名不一样,自己改$tableName的赋值逻辑就行,比如加个映射表。
内容来源于stack exchange
相关产品推荐
相关产品推荐

