使用PostGIS加载Tiger普查数据时遇shp2pgsql插入列数不匹配错误
解决PostGIS Tiger数据加载中EDGE表的
INSERT has more target columns than expressions错误 嘿,这个问题我之前帮不少开发者排查过,咱们一步步来搞定它!
错误本质先搞懂
你遇到的ERROR: INSERT has more target columns than expressions就是字面意思:INSERT语句里指定的目标列数量,和后面要插入的数值/表达式数量对不上。从NOTICE里的语句能看到,tiger_data.al_edges的列列表到the_geom还有省略号,说明脚本里生成的VALUES部分少了对应字段的值,导致列数和值数不匹配。
具体解决方案
1. 先确认版本兼容性
Tiger普查数据的年份和PostGIS版本必须匹配,不然很容易出现字段不兼容的问题:
- 运行这条SQL查看你的PostGIS完整版本:
SELECT postgis_full_version(); - 对照你下载的Tiger数据年份(比如2022、2023),确保PostGIS版本支持该年份的数据(比如PostGIS 3.2+支持2022及以后的Tiger数据)。如果版本不匹配,要么升级PostGIS,要么下载对应年份的Tiger数据。
2. 重新生成正确的加载脚本
有时候loader_generate_script的参数不对,会生成字段不匹配的脚本。重新运行生成脚本的SQL,确保参数正确:
-- 示例:加载阿拉巴马州(AL)的数据,指定tiger schema,加载edges、faces、地址等组件 SELECT loader_generate_script(ARRAY['AL'], 'tiger', true, true, true);
生成新脚本后,对比之前的脚本,看看EDGE表的INSERT语句列数和VALUES数量是否对应。
3. 手动修正现有脚本(如果不想重新生成)
如果你已经有了脚本,找到对应al_edges的INSERT代码块:
- 先数一下
INSERT INTO tiger_data.al_edges(...)里的列总数 - 再数一下
VALUES(...)里的数值数量 - 补上缺失的数值(或者删除多余的列,不过更常见的是脚本漏了值)。比如,如果表新增了
foo字段,脚本里INSERT包含了这个列,但VALUES里没给值,就需要补上对应的占位符或者默认值。
4. 验证目标表结构
运行这条SQL查看al_edges的表结构,确保INSERT语句里的列和表实际列一致:
\d tiger_data.al_edges
如果表结构里有脚本没覆盖的列,要么修改INSERT语句包含这些列并赋值,要么给这些列设置默认值(如果允许的话)。
额外注意点
- 加载时继续用
-v ON_ERROR_EXIT=1参数,这样脚本会在出错时立刻停止,方便你定位问题 - 确保执行脚本的数据库用户对
tiger和tiger_dataschema有读写权限
内容的提问来源于stack exchange,提问作者jarbaugh
相关产品推荐
相关产品推荐

