我需要更改表中的数据类型,但遇到依赖性错误。是否可以直接在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"
该列有许多依赖项。
答案 0 :(得分:1)
回答你的问题:
可以将INTEGER列的数据类型更改为NUMERIC 直接在pg_attribute?
否,事实并非如此。数据类型integer
和numeric
不是二进制兼容的。尝试弄乱系统目录通常是一个非常糟糕的主意。你肯定会打破你的数据库。 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,然后重新创建视图。