如何使用PostgreSQL更改或更改视图中的列类型?

时间:2016-05-10 04:56:50

标签: postgresql

我有一个视图,其中一个列是timetaken类型整数我想将其更改为数字。为此我使用下面的语法

ALTER VIEW view_timesheets  ALTER COLUMN timetaken type numeric;

当我运行时,我得到了例外

  

" view_timesheets"不是表,复合类型或外表

请解释如何更改列类型。谢谢

2 个答案:

答案 0 :(得分:4)

这是不可能的。您必须通过提供完整的定义来重新创建视图。另请注意,更改列的类型时甚至无法创建或替换视图。如果您拥有依赖于视图更改的视图,则还必须对其进行DROP / CREATE。

在我的公司中,我们使用的策略是在数据库中可以恢复的所有内容(如视图,函数等)存储在一堆大型SQL文件中,我们每次在基础表结构中发生任何更改时都会执行这些文件,因此我们不必关心受抚养的意见。

这些文件中的视图部分基本上是:

DROP VIEW IF EXISTS vw_a CASACDE;
CREATE OR REPLACE VIEW vw_a AS
...;

DROP VIEW IF EXISTS vw_b_depending_on_a CASACDE;
CREATE OR REPLACE VIEW vw_b_depending_on_a AS
...;

当然,第二个CASCADE以及OR REPLACE似乎毫无用处,但它们可以轻松地将更改后的定义轻松复制并粘贴到正在运行的开发数据库中,而无需太多思考。

答案 1 :(得分:0)

在转换列类型的视图时,我也遇到了类似的问题。

我使用CAST()运算符将类型从Integer转换为Varchar(5)。

我的表中有一个名为age的列,其类型为Integer。因此,使用该表创建的视图查询的类型也为Integer。因此,我在视图查询中使用了CAST()运算符来更改列类型。

CASE
  WHEN vhcl_insp_dtls.age = 0 THEN CAST('NEW' AS VARCHAR(5))
  ELSE CAST(vhcl_insp_dtls.age AS VARCHAR(5))
END AS age,

因此,您可以在不删除视图查询的情况下对其进行修改。