更改视图中使用的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。