使用 Postgres 数据库。我有一个现有的表,以及查询该表的几个现有视图。将该表称为“联系人”。
我更改了该表,将名称更改为“contacts_backup”。然后,我创建了一个新表,其名称与旧表用于“联系人”的名称相同
现在看来,如果我查询现有视图,数据仍然从重命名的表 contacts_backup 中检索,而不是从新表“contacts”中检索。
这可以吗?如何更新视图以查询同名的新表,而不是重命名的contacts_backup?
我的新表其实是一个外表,但是原理不应该是一样的吗?我期望现有表能够查询新表,而不是旧的重命名表。
更新现有视图以从新表中查询的有效方法是什么?
这是因为 PostgreSQL 不将视图定义存储为 SQL 字符串,而是存储为解析的查询树。
这些解析的查询树不包含引用对象的名称,而仅包含它们的对象标识符( oid),当您重命名对象时,该标识符不会更改。对于表列也是如此。这一切也适用于外国表。
当您检查视图定义时,例如使用pg_get_viewdef,解析树将呈现为文本,因此您将看到更改的名称。
如果您想更改视图引用的表,唯一的解决方案是再次DROP更改视图CREATE,或者您可以使用CREATE OR REPLACE VIEW.