更改视图中使用的PostgreSQL列

我希望PostegreSQL放松一下。 每次我想改变一个视图中使用的列,似乎我必须删除视图,更改字段,然后重新创build视图。 我可以放弃额外的保护,只是告诉PostgreSQL让我改变领域,然后找出调整视图?

澄清:我明白什么是一个观点。 实际上,这是因为这个视图就像一个子查询,我希望能够改变底层的表格,并让视图接受这个变化。

假设我有以下几点:

CREATE TABLE monkey ( "name" character varying(50) NOT NULL, ) CREATE OR REPLACE VIEW monkey_names AS SELECT name FROM monkey 

我真的只想在迁移脚本中执行以下操作, 不必删除并重新创build视图。

 ALTER TABLE monkey ALTER COLUMN "name" character varying(100) NOT NULL 

这种情况的永久解决scheme

为了避免这个问题,可以使用数据typestext或者varchar / character varying长度说明符而不是character varying(n) 。 阅读手册中的这些数据types。

 CREATE TABLE monkey(name text NOT NULL) 

如果您确实需要强制执行最大长度,请创build一个CHECK约束

 ALTER TABLE monkey ADD CONSTRAINT monkey_name_len CHECK (length(name) < 101); 

您可以随时更改或删除该约束,而无需触及像视图这样的依赖对象,也不会因为types的改变(在现代版本的Postgres中不再需要Postgres)而强制Postgres在表中写入新行。

详细的解释

正如@Michael所提议的,我添加了一些更一般的信息:

PostgreSQL中的视图不仅仅是“子查询的别名”。 视图被实现为特殊表,其中规则ON SELECT TO my_view DO INSTEAD 。 (这就是为什么你可以用ALTER TABLE命令来改变视图。)你可以授予它权限,添加注释,甚至定义列的默认值(对ON INSERT TO my_view DO INSTEAD...的规则很有用)。 阅读手册在这里或这里 。

如果更改基础对象,则还需要更改任何相关视图的定义查询。 ALTER VIEW语句只能更改视图的辅助属性。 使用CREATE OR REPLACE VIEW来改变查询 – 它将保留任何附加属性。

但是,如果您想要更改结果列的数据types(就像手头的情况一样), CREATE OR REPLACE VIEW是不可能的。 您必须DROP旧的并CREATE一个新的视图。 这绝不会删除任何基础表的数据。 它将删除视图的任何其他属性,但是,也必须重新创build。