更改具有从整数到数字的依赖关系的列的数据类型

时间:2012-07-12 16:10:19

标签: postgresql types alter-table catalog dml

我需要更改表中的数据类型,但遇到依赖性错误。是否可以直接在pg_attribute中将INTEGER列的数据类型更改为NUMERIC

我尝试使用ALTER TABLE但它不起作用:

CREATE TABLE documento (
  iddocumento SERIAL, 
  idtipodocumento INTEGER NOT NULL, 
  folio INTEGER NOT NULL, 
  CONSTRAINT pk_documento PRIMARY KEY(iddocumento)
);

ALTER TABLE documento ALTER COLUMN folio TYPE NUMERIC(10,0);

错误:

ERROR:  cannot alter type of a column used by a view or rule
DETAIL:  rule _RETURN on view vw_xxx depends on column "folio"

该列有许多依赖项。

3 个答案:

答案 0 :(得分:1)

回答你的问题:

  

可以将INTEGER列的数据类型更改为NUMERIC   直接在pg_attribute?

,事实并非如此。数据类型integernumeric不是二进制兼容的。尝试弄乱系统目录通常是一个非常糟糕的主意。你肯定会打破你的数据库。 SQL DML语句是您想要更改数据库设计时使用的工具。


@a_horse已经评论过PostgreSQL中的限制。

有像@a_horse描述的解决方法 - 我使用pgAdmin来收集用于删除和重新创建视图的DDL脚本。 psql也有效。

还有另一个更简单的方法 - 如果你能负担得起:转储数据库,破解转储并恢复它。这样您只需要在转储中更改一行documento.folio的列定义(整数值适合数字列就好了)。

但是您需要在操作期间独占访问数据库,即所有其他访问都被阻止。所以,这基本上只适用于开发中的小型数据库或数据库。

答案 1 :(得分:1)

试试这个:

DROP DROP DROP

ALTER TABLE documento ALTER COLUMN folio TYPE NUMERIC(10,0);

CREATE CREATE CREATE...

当然可以正常工作

答案 2 :(得分:0)

这在PostgreSQL中是一个非常烦人的限制:你不能改变在视图中使用列的表的列定义。

不幸的是,唯一的解决方法是首先删除引用该列的所有视图,然后执行alter table,然后重新创建视图。