这是一个在多种情况下出现的一般性问题,下面的示例具有代表性,但并不详尽。我对学习在不完美(但足够接近)数据源上使用 Postgres 的任何方式感兴趣。
具体案例——我将 Postgres 与 PostGIS 一起用于处理以 shapefile 和 xml 发布的政府数据。使用与 PostGIS 一起分发的 shp2pgsql 模块(例如在这个数据集上)我经常得到这样的模式:
Column | Type |
------------+-----------------------+-
gid | integer |
st_fips | character varying(7) |
sfips | character varying(5) |
county_fip | character varying(12) |
cfips | character varying(6) |
pl_fips | character varying(7) |
id | character varying(7) |
elevation | character varying(11) |
pop_1990 | integer |
population | character varying(12) |
name | character varying(32) |
st | character varying(12) |
state | character varying(16) |
warngenlev | character varying(13) |
warngentyp | character varying(13) |
watch_warn | character varying(14) |
zwatch_war | bigint |
prog_disc | bigint |
zprog_disc | bigint |
comboflag | bigint |
land_water | character varying(13) |
recnum | integer |
lon | numeric |
lat | numeric |
the_geom | geometry |
我知道这些 varchar 中至少有 10 个——fips、海拔、人口等,应该是整数;但是当我试图这样投射它们时,我得到了错误。一般来说,我认为我可以通过允许 Postgres 在更改列和更改类型时接受空字符串作为列的默认值(例如对于 int 类型为 0 或 -1)来解决我的大部分问题。这可能吗?
如果我在导入之前使用从原始数据源生成的类型声明创建表,我会得到比使用 shp2pgsql 更好的类型,并且可以遍历将它们提供给数据库的源条目,丢弃任何失败的插入。根本问题是,如果我有 1% 的坏字段,均匀分布在 25 列上,我将丢失 25% 的数据,因为如果任何字段是坏的,给定的插入将失败。我希望能够在以后尽最大努力插入并修复任何问题,而不是丢失那么多行。
欢迎处理过类似问题的人提供任何意见——我不是一个试图让 PostgreSQL 犯下我习惯的所有相同错误的 MySQL 人——只是处理我无法完全控制的数据。