PostgreSQL删除表列遇依赖报错,如何删除列并重建依赖视图?
在PostgreSQL 9.6.6(Windows 10环境)下,要删除test_col_drp表的col3列并保留重建依赖视图,不能直接用CASCADE(它会直接删除视图而非更新),最佳操作流程如下:
步骤1:导出视图的原始定义
首先需要获取两个视图的创建SQL,方便后续修改后重建。使用PostgreSQL内置函数pg_get_viewdef即可:
-- 获取test_col_drp_vw1的创建语句 SELECT pg_get_viewdef('test_col_drp_vw1', true); -- 获取test_col_drp_vw2的创建语句 SELECT pg_get_viewdef('test_col_drp_vw2', true);
执行后会得到视图的完整SQL,你需要手动移除其中所有和col3相关的字段(包括别名col3_vw1、col3_vw2),准备好重建用的干净语句。
步骤2:删除依赖视图
由于视图依赖于要删除的col3列,必须先删除它们才能操作原表:
-- 先删层级更高的vw2(它依赖vw1) DROP VIEW test_col_drp_vw2; -- 再删vw1 DROP VIEW test_col_drp_vw1;
步骤3:删除表中的col3列
此时已无依赖对象,可以安全删除目标列:
ALTER TABLE test_col_drp DROP COLUMN col3;
步骤4:重建视图
用步骤1中修改后的SQL重建视图,确保不再包含col3相关字段:
-- 重建vw1 CREATE VIEW test_col_drp_vw1 AS SELECT col1 col1_vw1, col2 col2_vw1 FROM test_col_drp; -- 重建vw2 CREATE VIEW test_col_drp_vw2 AS SELECT col1_vw1 col1_vw2, col2_vw1 col2_vw2 FROM test_col_drp_vw1;
可选:用事务保证操作原子性
如果希望整个流程要么全部成功要么回滚(避免中间出错导致状态不一致),可以把所有步骤包裹在事务中:
BEGIN; -- 删除视图 DROP VIEW test_col_drp_vw2; DROP VIEW test_col_drp_vw1; -- 删除列 ALTER TABLE test_col_drp DROP COLUMN col3; -- 重建视图 CREATE VIEW test_col_drp_vw1 AS SELECT col1 col1_vw1, col2 col2_vw1 FROM test_col_drp; CREATE VIEW test_col_drp_vw2 AS SELECT col1_vw1 col1_vw2, col2_vw1 col2_vw2 FROM test_col_drp_vw1; -- 提交事务 COMMIT;
额外提醒
- 如果视图有特殊权限设置(比如给其他用户的查询权限),删除前可以用psql命令
\dp test_col_drp_vw*查看权限,重建后记得重新赋予对应权限。 - 若有大量嵌套视图,可考虑编写脚本批量处理,但针对这两个视图,手动操作更简单直接。
内容的提问来源于stack exchange,提问作者Vikram
相关产品推荐
相关产品推荐

