Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
让PostgreSQL更具容错性?_Sql_Postgresql_Types_Postgis - Fatal编程技术网

让PostgreSQL更具容错性?

让PostgreSQL更具容错性?,sql,postgresql,types,postgis,Sql,Postgresql,Types,Postgis,这是一个在多个上下文中出现的一般性问题,下面的示例具有代表性,但并不详尽。我对学习如何在不完善但足够接近的数据源上与博士后合作感兴趣 具体案例——我使用Postgres和PostGIS处理以Shapefile和xml格式发布的政府数据。例如,在dataset上使用与PostGIS一起分发的shp2pgsql模块,我经常得到如下模式: Column | Type | ------------+-----------------------+- gid

这是一个在多个上下文中出现的一般性问题,下面的示例具有代表性,但并不详尽。我对学习如何在不完善但足够接近的数据源上与博士后合作感兴趣

具体案例——我使用Postgres和PostGIS处理以Shapefile和xml格式发布的政府数据。例如,在dataset上使用与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              |
我知道至少有10个varchars——FIP、海拔、人口等,应该是INT;但当我试图将它们转换成这样时,我会出错。一般来说,我认为我可以通过允许Postgres在更改列和更改类型时接受一个空字符串作为列的默认值来解决大多数问题,比如0或-1表示int类型。这可能吗

如果我在导入之前使用从原始数据源生成的类型声明创建表,我会得到比shp2pgsql更好的类型,并且可以迭代将它们提供给数据库的源条目,放弃任何失败的插入。基本问题是,如果我有1%的坏字段,平均分布在25列上,我将丢失25%的数据,因为如果任何字段坏了,给定的插入将失败。我希望能够尽最大努力在以后插入并修复任何问题,而不是丢失那么多行


处理过类似问题的人的任何输入都是受欢迎的-我不是一个MySQL的家伙,我不想让PostgreSQL犯我习惯的所有错误-只是处理我无法完全控制的数据。

您能从shp2pgsql生成一个SQL文件,并在执行之前对数据进行一些处理吗?如果数据为复制格式,则应易于分析并更改为\N insert as null for columns

另一种可能是使用shp2pgsql将数据加载到一个暂存表中,其中所有字段都定义为“文本”类型,然后使用INSERT…SELECT语句将数据复制到最终位置,还可以对SELECT中的数据进行处理,将空字符串转换为null等

我不认为有什么方法可以覆盖字符串如何转换为int等行为:可能您可以创建自己的类型或域,并定义一个更宽松的隐式强制转换。。。但这听起来很糟糕,因为这些类型实际上只是数据如何到达系统的工件,而不是之后您想要保留的东西

您询问了在更改列类型时如何进行修复:您也可以这样做,例如:

steve@steve@[local] =# create table test_table(id serial primary key, testvalue text not null);
NOTICE:  CREATE TABLE will create implicit sequence "test_table_id_seq" for serial column "test_table.id"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "test_table_pkey" for table "test_table"
CREATE TABLE
steve@steve@[local] =# insert into test_table(testvalue) values('1'),('0'),('');
INSERT 0 3
steve@steve@[local] =# alter table test_table alter column testvalue type int using case testvalue when '' then 0 else testvalue::int end;
ALTER TABLE
steve@steve@[local] =# select * from test_table;
 id | testvalue
----+-----------
  1 |         1
  2 |         0
  3 |         0
(3 rows)

这几乎等同于我上面建议的staging table思想,只是现在staging table是您的最终表。改变这样的列类型无论如何都需要重写整个表:因此,实际上,使用一个临时表并同时重新格式化多个列可能更有效。

能否从shp2pgsql生成一个SQL文件,并在执行之前对数据进行一些处理?如果数据为复制格式,则应易于分析并更改为\N insert as null for columns

另一种可能是使用shp2pgsql将数据加载到一个暂存表中,其中所有字段都定义为“文本”类型,然后使用INSERT…SELECT语句将数据复制到最终位置,还可以对SELECT中的数据进行处理,将空字符串转换为null等

我不认为有什么方法可以覆盖字符串如何转换为int等行为:可能您可以创建自己的类型或域,并定义一个更宽松的隐式强制转换。。。但这听起来很糟糕,因为这些类型实际上只是数据如何到达系统的工件,而不是之后您想要保留的东西

您询问了在更改列类型时如何进行修复:您也可以这样做,例如:

steve@steve@[local] =# create table test_table(id serial primary key, testvalue text not null);
NOTICE:  CREATE TABLE will create implicit sequence "test_table_id_seq" for serial column "test_table.id"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "test_table_pkey" for table "test_table"
CREATE TABLE
steve@steve@[local] =# insert into test_table(testvalue) values('1'),('0'),('');
INSERT 0 3
steve@steve@[local] =# alter table test_table alter column testvalue type int using case testvalue when '' then 0 else testvalue::int end;
ALTER TABLE
steve@steve@[local] =# select * from test_table;
 id | testvalue
----+-----------
  1 |         1
  2 |         0
  3 |         0
(3 rows)

这几乎等同于我上面建议的staging table思想,只是现在staging table是您的最终表。更改这样的列类型需要重写整个表:因此,实际上,使用临时表并同时重新格式化多个列可能会更有效。

My gods,将空字符串替换为\N实际上修复了所有错误。我将研究如何让shp2pgsql在原始转换中执行此操作。这将使我的错误率降低到大约.2%,使用不带引号的Null实际上比“\N”更成功。我的上帝,用\N替换空字符串实际上修复了所有错误。我将研究如何让shp2pgsql在原始转换中执行此操作。这将使我的错误率降低到大约.2%,使用无引号的Null实际上比使用“\N”更成功。