【发布时间】:2016-09-04 21:40:00
【问题描述】:
我有一个观点,其中一列是时间类型整数,我想将其更改为数字。为此,我使用了以下语法
ALTER VIEW view_timesheets ALTER COLUMN timetaken type numeric;
当我运行这个时,我得到了异常
“view_timesheets”不是表、复合类型或外部表
请说明如何更改列类型。谢谢
【问题讨论】:
标签: postgresql
我有一个观点,其中一列是时间类型整数,我想将其更改为数字。为此,我使用了以下语法
ALTER VIEW view_timesheets ALTER COLUMN timetaken type numeric;
当我运行这个时,我得到了异常
“view_timesheets”不是表、复合类型或外部表
请说明如何更改列类型。谢谢
【问题讨论】:
标签: postgresql
这是不可能的。您必须通过提供其完整定义来重新创建视图。另请注意,当您更改列的类型时,您甚至无法创建或替换视图。如果您的视图依赖于更改的视图,您也必须 DROP / CREATE 它们。
在我的公司中,我们使用的策略是将数据库中可重新创建的所有内容(如视图、函数等)存储在一堆大型 SQL 文件中,每当底层表结构发生任何变化时,我们都会执行这些文件,所以我们不必关心依赖视图。
这些文件中的视图部分基本上是这样的:
DROP VIEW IF EXISTS vw_a CASCADE;
CREATE OR REPLACE VIEW vw_a AS
...;
DROP VIEW IF EXISTS vw_b_depending_on_a CASCADE;
CREATE OR REPLACE VIEW vw_b_depending_on_a AS
...;
当然,第二个 CASCADE 以及 OR REPLACE 似乎没用,但它们可以轻松地将更改的定义复制并粘贴到正在运行的开发数据库中,而无需太多思考。
【讨论】:
我在转换视图的列类型时也遇到了类似的问题。
我使用 CAST() 运算符将类型从 Integer 转换为 Varchar(5)。
我的表中有一个名为 age 的列,它的类型为 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,
所以通过这种方式,您可以修改视图查询而不会删除它。
【讨论】: