【问题标题】:How To change or alter column type in Views using PostgreSQL?如何使用 PostgreSQL 更改或更改视图中的列类型?
【发布时间】:2016-09-04 21:40:00
【问题描述】:

我有一个观点,其中一列是时间类型整数,我想将其更改为数字。为此,我使用了以下语法

ALTER VIEW view_timesheets  ALTER COLUMN timetaken type numeric;

当我运行这个时,我得到了异常

“view_timesheets”不是表、复合类型或外部表

请说明如何更改列类型。谢谢

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    这是不可能的。您必须通过提供其完整定义来重新创建视图。另请注意,当您更改列的类型时,您甚至无法创建或替换视图。如果您的视图依赖于更改的视图,您也必须 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 似乎没用,但它们可以轻松地将更改的定义复制并粘贴到正在运行的开发数据库中,而无需太多思考。

    【讨论】:

    • 错字:CASACDE :)
    • 修正错字CASACDE :)。
    • 一个值得注意的补充:当您删除视图时,您也会丢失所有授予任何数据库用户的 GRANT。因此,重新创建视图的脚本也需要包含所需的每个 GRANT。
    • @SebastianH 正确,GRANT,例如查看用户也是此处重新创建文件的一部分。
    【解决方案2】:

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

    我使用 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,
    

    所以通过这种方式,您可以修改视图查询而不会删除它。

    【讨论】:

    • 我有一个 alter table emp alter column status type numeric(2) 失败说有一个规则取决于列“status”....如何解决这个问题?
    • @ShubhroMukherjee,解决您的问题有两种方法。 1) 删除导致问题的视图,然后运行您的 alter table 语句。然后,一旦您更改了表格,您就可以再次创建视图。 2)或者如果你不能放弃你的观点,那么请按照这个特定的stackover流程线程=>stackoverflow.com/questions/3243863/…
    猜你喜欢
    • 1970-01-01
    • 2012-01-21
    • 1970-01-01
    • 1970-01-01
    • 2011-11-02
    • 2021-07-26
    • 2012-03-31
    • 1970-01-01
    • 2017-12-03
    相关资源
    最近更新 更多