Postgres 视图,在使用 alter table 更改表名之后,视图仍然查询原表名?

5

使用Postgres数据库。我有一个现有的表和几个查询该表的视图。 将表称为“contacts”。

我更改了表的名称为“contacts_backup”。然后创建了一个与旧表名称相同的新表“contacts”。

现在,如果我查询现有的视图,数据仍从重命名的表contacts_backup检索,而不是新表“contacts”。这可能吗?如何更新视图以从新表而不是已重命名的contacts_backup中查询数据?

我的新表实际上是外部表,但原则应该相同吧?我希望现有表针对新表进行查询,而不是旧表。

有什么有效的方法可以更新现有视图以从新表中查询数据吗?

1个回答

5
这是因为PostgreSQL并不将视图定义存储为SQL字符串,而是作为解析的查询树。
这些解析的查询树不包含所引用对象的名称,仅包含它们的对象标识符(oid),在重命名对象时不会更改。表列也是如此。这对外部表也适用。
如果您查看视图定义,例如使用pg_get_viewdef,则解析树将呈现为文本,因此您将看到更改后的名称。
如果要更改视图所引用的表,则唯一的解决方案是DROP视图并重新CREATE,或者可以使用CREATE OR REPLACE VIEW

有没有简单的方法来更新它们,还是我只需要删除它们所有,更新它们的查询,然后重新创建? - jackrabbithanna
你可以使用 CREATE OR REPLACE VIEW,请查看我的更新答案。 - Laurenz Albe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接