Postgresql 将具有依赖项的列的数据类型从整数更改为数字

Postgresql 将具有依赖项的列的数据类型从整数更改为数字,postgresql,types,alter-table,catalog,dml,Postgresql,Types,Alter Table,Catalog,Dml,我需要更改表中的数据类型,但遇到依赖项错误。是否可以直接在pg_属性中将整数列的数据类型更改为数值 我尝试了altertable,但它不起作用: CREATE TABLE documento ( iddocumento SERIAL, idtipodocumento INTEGER NOT NULL, folio INTEGER NOT NULL, CONSTRAINT pk_documento PRIMARY KEY(iddocumento) ); ALTER TABL

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

我尝试了
altertable
,但它不起作用:

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"

该列有许多依赖项。

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


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

要回答您的问题:

可以将整型列的数据类型更改为数字 直接在pg_属性中

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


@一匹马已经对PostgreSQL的局限性发表了评论

这里有一个类似@a_horse descripes的变通方法——我用来收集DDL脚本,以便删除和重新创建视图<代码>psql也可以工作

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

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

尝试以下方法:

DROP DROP DROP

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

CREATE CREATE CREATE...

Sure可以正常工作

请向我们展示有问题的表的创建表、完整的ALTER TABLE和完整的错误消息。字符串“不工作”不是PostgreSQL中内置的错误消息。对于较小的数据库,我建议将数据库分为两部分:--仅模式(相对较小,通常只有几千行),而且--仅数据(可能很大,但您不需要触摸它)您甚至可以通过将其导入新的(临时)数据库来测试更改,这将使您能够跟踪和修复所有依赖项。