【问题标题】:Changing the data type of a column in PostgreSQL 9.1在 PostgreSQL 9.1 中更改列的数据类型
【发布时间】:2012-12-16 09:02:57
【问题描述】:

我正在通过“PostGIS in Action”一书学习 PostgreSQL 和 PostGIS。我的问题来自 Pg。清单 3.4 中的 66。

我的代码如下:

CREATE TABLE ch03.paris_polygons(tags hstore, CONSTRAINT paris_polygons_pk PRIMARY KEY (gid)
)
INHERITS (ch03.paris);

ALTER TABLE ch03.paris_polygons NO INHERIT ch03.paris;
INSERT INTO ch03.paris_polygons(osm_id, ar_num, geom, tags, feature_name, feature_type)
SELECT osm_id, ar_num, ST_Multi(geom) As geom, tags, tags->'name',
COALESCE(tags->'tourism', tags->'railway','other')::varchar(50) As feature_type
FROM ch03.paris_hetero
WHERE ST_GeometryType(geom) LIKE '%Polygon';
SELECT populate_geometry_columns('ch03.paris_polygons'::regclass);
ALTER TABLE ch03.paris_polygons INHERIT ch03.paris;

运行代码后我收到此错误:

ERROR: child table "paris_polygons" has different type for column "geom"
SQL state: 42804

我用谷歌搜索了这个:

-204 (ECPG_INT_FORMAT)

The host variable is of type int and the datum in the database is of a different type and contains a value that cannot be interpreted as an int. The library uses strtol() for this conversion. (SQLSTATE 42804)

什么 psql 命令可以帮助我了解如何合并这些命令?

再次感谢大家的帮助!

【问题讨论】:

  • 继承paris然后立即将ALTER变成NO INHERIT有什么问题?这很奇怪。
  • 我不确定,因为我对 PostgreSQL 非常陌生。代码取自书中。
  • 搜索结果引用了ECPG。除非您使用 ECPG,否则它是无关紧要的。你在代码的哪一行得到了错误? paris的定义是什么?显示来自psql\d paris 输出。
  • 父表是否有像geometry(Polygon,4326)这样的typmod?
  • @Craig Ringer 不幸的是,对于 PostgreSQL 9.1,我不能使用 \d。这与 [stackoverflow.com/a/109337/1777654] 相同还是有其他方法可以检查?

标签: postgis postgresql-9.1 type-conversion


【解决方案1】:

我刚碰到这个。这本书很可能在您(和我)正在查看的代码的 sn-p 中忘记了这一步。但是,如果您继续阅读下一页,他们只显示了 LINESTRING 分区表的构造,他们在 POLYGON 分区表构造中忘记了一条关键线:

ALTER TABLE ch03.paris_polygons
ADD CONSTRAINT enforce_geotype_geom
CHECK (geometrytype(geom) = 'POLYGON'::TEXT);

一旦我添加了该约束,错误就消失了,基本上它导致发生的原因是允许 geom 列继承父 geom 列类型,而不是它假设的 geometry('polygon',SRID) 类型基于数据加载,并留下约束来管理类型限制。

【讨论】:

  • 另外,只是为了解决@Craig Ringer 关于在子表上启用 INHERIT,然后立即将表更改为 NO INHERIT 的评论:本书尝试遵循使用 Postgres 表继承的最佳实践。他们首先使用继承创建了子表,以便该表接收所有父表的属性,然后他们关闭继承,以便他们可以对子表进行批量插入,而不会影响父表或父表的其他子表。当然,他们不必在他们设计的示例中这样做,但为了推广最佳实践,这是有道理的。
  • 这不再起作用了。现在插入新行时出现错误:'错误:关系“paris_polygons”的新行违反检​​查约束“enforce_geotype_geom”'
【解决方案2】:

我遇到了同样的错误。我尝试改用“MULTIPOLYGON”:

ALTER TABLE ch03.paris_polygons
ADD CONSTRAINT enforce_geotype_geom
CHECK (geometrytype(geom) = 'MULTIPOLYGON'::TEXT);

【讨论】:

  • 这是一个尝试解决问题失败的答案还是一个问题?如果是后者,您需要提出一个新问题。
猜你喜欢
  • 2021-07-26
  • 2011-11-02
  • 2021-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-06
  • 1970-01-01
相关资源
最近更新 更多