これは、いくつかの状況で出てきた一種の一般的な質問です。以下の例は代表的なものですが、網羅的なものではありません。私は、不完全な(しかし十分に近い)データソースでPostgresを使用する方法を学ぶことに興味があります。
特定のケース-シェープファイルとxmlで公開された政府データを処理するためにPostGISでPostgresを使用しています。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、標高、人口など)はintである必要があることを私は知っています。しかし、それらをそのようにキャストしようとすると、エラーが発生します。一般に、列を変更して型を変更するときに、Postgresが列のデフォルト値(たとえば、int型の場合は0または-1)として空の文字列を受け入れるようにすることで、ほとんどの問題を解決できると思います。これは可能ですか?
元のデータソースから生成された型宣言を使用してインポートする前にテーブルを作成すると、shp2pgsqlを使用するよりも優れた型が得られ、データベースにフィードするソースエントリを反復処理して、失敗した挿入を破棄できます。基本的な問題は、1%の不良フィールドがあり、25列に均等に分散されている場合、いずれかのフィールドが不良であると特定の挿入が失敗するため、データの25%が失われることです。それほど多くの行を失うのではなく、ベストエフォートの挿入を作成して、後で問題を修正できるようにしたいと思います。
同様の問題を扱ったことのある人からの意見は大歓迎です。私は、PostgreSQLを打ち負かして、慣れているのと同じ間違いを犯そうとしているMySQLの男ではありません。完全に制御できないデータを扱っているだけです。