0

我需要更改表中的数据类型,但遇到依赖错误。是否可以直接在 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"

该列具有许多依赖项。

4

3 回答 3

1

要回答您的问题:

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

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


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

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

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

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

于 2012-07-12T16:42:51.627 回答
1

试试这个:

DROP DROP DROP

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

CREATE CREATE CREATE...

当然工作正常

于 2013-12-30T21:50:40.383 回答
0

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

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

于 2012-07-12T16:40:39.037 回答