赞
踩
昨天接到需求,要修改一个使用已久的的表的字段长度,现有字段长度不能满足需求。
直接使用以下语句会出现报错:
- ERROR: cannot alter type of a column used by a view or rule.
- rule _RETURN on view 相关依赖视图 depends on column "字段名
- 执行sql
- alter table tbname alter COLUMN 字段名 type varchar(500) ;
找了几个大佬博客,有大佬做出相关方案,做个整理。
通过修改 pg_attribute 基表的方式来绕开这个限制
pg_attribute (详情)
- #通过表名查出attrelid
- SELECT relname, attname,attnum,attrelid,attname FROM pg_class c,pg_attribute attr WHERE relname = '表名' AND c.oid = attr.attrelid;
-
- #修改字段长度
- update pg_attribute set atttypmod =34 WHERE attrelid ='a'::regclass AND attname = '字段名';
-
- #查询修改后长度
- SELECT atttypmod FROM pg_attribute WHERE attrelid = '3648177'::regclass AND attname = '字段名';
-
修改字段类型这种情况多见于执行SQL缓慢,通过执行计划发现是字段类型不匹配产生了隐式在转换,而无法使用上索引。
这种情况就得通过我们之前的方法来实现,把删除视图、修改字段、创建视图放到一个事务下执行,但是如果嵌套的视图比较多就很麻烦。为了克服这个麻烦,就有一个大神级人物写了两个函数来轻松实现了这个问题。由于太多人受到这个“烦恼”问题的困扰,作者得到了极高的赞扬。
BEGIN;
select deps_save_and_drop_dependencies('public', 'a');
alter table a alter name type varchar(30);
select deps_restore_dependencies('public', 'a');
COMMIT
以下是我在自己环境中进行的测试,非常简单就搞定了。
函数可以在github上下载:
https://gist.github.com/mateuszwenus/11187288(PG12之前版本)
https://gist.github.com/briandignan/03ef42e78434658cf27f052e2f0798e8(PG12之后的版本)
如果让我推荐,我还是推荐使用第二种方法,毕竟这个方法比较稳妥一点。也基本上达到了比较完美的地步。就算遇到上百个视图或者像俄罗斯套娃一样的视图你也不用担心了。
详情参见原文链接:https://blog.csdn.net/weixin_42367233/article/details/112658042
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。