Lar*_*nal 6 sql postgresql varchar types sql-view
我希望PostegreSQL能够放松一下.每次我想要更改视图中使用的列时,似乎我必须删除视图,更改字段然后重新创建视图.我是否可以放弃额外的保护并告诉PostgreSQL让我更改字段然后找出对视图的调整?
澄清: 我理解一个观点是什么.事实上,这是因为视图就像一个子查询,我希望我可以更改基础表并让视图获取更改.
假设我有以下内容:
CREATE TABLE monkey
(
"name" character varying(50) NOT NULL,
)
CREATE OR REPLACE VIEW monkey_names AS
SELECT name
FROM monkey
Run Code Online (Sandbox Code Playgroud)
我真的只想在迁移脚本中执行以下操作,而不必删除并重新创建视图.
ALTER TABLE monkey ALTER COLUMN "name" character varying(100) NOT NULL
Run Code Online (Sandbox Code Playgroud)
Erw*_*ter 12
要避免此问题,请使用数据类型text或varchar/ character varying而不使用长度说明符character varying(n).请阅读手册中的这些数据类型.
CREATE TABLE monkey(name text NOT NULL)
Run Code Online (Sandbox Code Playgroud)
如果您确实要强制执行最大长度,请创建CHECK约束:
ALTER TABLE monkey
ADD CONSTRAINT monkey_name_len CHECK (length(name) < 101);
Run Code Online (Sandbox Code Playgroud)
您可以随时更改或删除该约束,而不会触及视图之类的依赖对象,也不会强制Postgres根据类型的更改在表中写入新行(现代版本的Postgres中并不总是需要这样做).
正如@Michael所提议的,我添加了一些更一般的信息:
PostgreSQL中的视图不仅仅是"子查询的别名".视图作为带有规则的特殊表实现ON SELECT TO my_view DO INSTEAD.(这就是您可以使用ALTER TABLE命令更改视图的原因.)您可以对其进行GRANT权限,添加注释,甚至可以定义列默认值(对规则有用ON INSERT TO my_view DO INSTEAD...).在此处或此处阅读手册中的更多内容.
如果更改基础对象,则还需要更改任何从属视图的定义查询.该ALTER VIEW语句只能更改视图的辅助属性.使用CREATE OR REPLACE VIEW更改查询-它将保留任何附加属性.
但是,如果要更改结果列的数据类型(如在手边的情况下),CREATE OR REPLACE VIEW则无法实现.你需要DROP旧的和CREATE新的观点.这永远不会删除基础表的任何数据.但是,它将删除视图的任何其他属性,这些属性也必须重新创建.
| 归档时间: |
|
| 查看次数: |
10436 次 |
| 最近记录: |