当我创建视图时,我意外地发现每个splat操作符都会自动扩展。例如,使用以下设置:
CREATE TABLE test (
a integer,
b integer,
c integer
);
INSERT INTO test VALUES (1,2,3), (10,20,30);
CREATE VIEW test_view AS SELECT * FROM test;
以下SELECT
语句返回相同的结果:
SELECT * FROM test;
SELECT * FROM test_view;
但是,如果我在原始表中添加一列:
ALTER TABLE test ADD COLUMN x text DEFAULT 'new column';
...并发出与以前相同的SELECT
语句,查询视图时,新列会丢失。事实上,我使用pg_get_viewdef
函数验证了我的视图的实际定义 - splat已自动扩展到a,b和c列。
为什么它会像这样实现,我可以防止这种行为发生吗?
目前,我迫切需要创建多个视图来过滤表格的内容。但是,它们的整体结构将来可能会发生变化 - 可能会添加新列,有些可能会被剥离。在这一点上,我必须在更改表格后更新每个视图,坦率地说,我不喜欢这个声音。
我正在使用PostgreSQL 9.4