【问题标题】:Rename column in a view : bug or feature?重命名视图中的列:错误还是功能?
【发布时间】:2015-10-22 20:37:42
【问题描述】:

我在 Postgresql 9.4 物化视图中的列名上弄错了。

我看了文档,语法是:

ALTER MATERIALIZED VIEW my_view_name
RENAME COLUMN old_name 
TO new_name;

效果很好。

然后我在物化视图中出现了同样的错字。我复制粘贴了请求,忘记删除关键字 MATERIALIZED 并且......它成功了!

奇怪的是,如果我尝试:

ALTER VIEW my_view_name
RENAME COLUMN old_name 
TO new_name;

它不起作用,我收到语法错误!

换句话说:我似乎只能通过使用物化视图的语法来更改普通视图的列名。

这是错误还是功能?

重现步骤:

1) 创建一个简单的表

CREATE TABLE films (
  code        char(5) CONSTRAINT firstkey PRIMARY KEY,
  title       varchar(40) NOT NULL
);

2) 将视图创建为简单的选择:

CREATE VIEW view_films AS SELECT * FROM films;

3) 尝试重命名列:

ALTER VIEW view_films RENAME COLUMN title TO new_title;

错误:“COLUMN”处或附近的语法错误

4) 尝试相同,但使用关键字MATERIALIZED

ALTER MATERIALIZED VIEW view_films RENAME COLUMN title TO new_title;

更改表

【问题讨论】:

    标签: postgresql views materialized-views


    【解决方案1】:

    我不确定MATERIALIZED VIEW,但对于正常视图;该视图不存储任何数据,它只是一个保存的 SELECT 查询,并且在说出 select * from view_name 时它什么也不做,只是针对目标表运行底层 SELECT 语句。

    因此,更改列名的ALTER 语句应该针对创建视图的表而不是视图触发;它应该可以正常工作。试试下面:

    CREATE TABLE films (
      code        char(5) CONSTRAINT firstkey PRIMARY KEY,
      title       varchar(40) NOT NULL
    );
    
    CREATE VIEW view_films AS SELECT * FROM films;
    
    ALTER TABLE films RENAME COLUMN title TO new_title;
    

    对于MATERIALIZED VIEW 重命名列可能是因为它确实存储了数据。

    关于您的评论:您应该在ALTERING 表架构之后重新创建视图定义。检查这个小提琴http://sqlfiddle.com/#!15/9ebe1/1

    【讨论】:

    • 已测试:从表中修改列名对视图结果没有影响(该列仍然具有旧名称)。
    • 查看答案编辑;如果有帮助。本质上,您应该在更改表架构后重新创建视图定义。
    • 这就是,我已经在非物化视图上测试了改变物化视图,它确实成功地重命名了视图/其选择语句中的列名。这非常令人惊讶。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    • 2013-05-08
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    • 2022-11-24
    相关资源
    最近更新 更多