不能改变PostgreSQL中视图或规则使用的列的类型

时间:2017-05-10 07:13:05

标签: sql postgresql

我不想通过

将列的大小从字符(9)更改为字符(12)
ALTER TABLE product_based_award ALTER COLUMN name TYPE character(12);

但是内部此列由MView使用,因此不允许更改表并给出以下错误。

  

错误:无法更改视图或规则使用的列的类型

我找到了两个解决方案,一个是删除mview并重新创建它,另一个是更新pg_attribute。 但我不能使用这两个选项,因为我们的数据库非常复杂,因此更新pg_attribute会导致问题,也不能丢弃mview。

还有其他最好的方法来解决这个问题。

1 个答案:

答案 0 :(得分:1)

更新pg_attribute始终是个坏主意

减少用户等待新定义的时间(假设它在很长时间内加载数据),您可以使用:

让p117老去竞争:

t=# create materialized view s117 as select now()::timestamp(1);
SELECT 1
Time: 54.329 ms

改变它:

t=# create materialized view s117_new as select now()::timestamp(2);
SELECT 1
Time: 64.024 ms
t=# begin;
BEGIN
Time: 0.099 ms
t=# drop materialized view s117;
DROP MATERIALIZED VIEW
Time: 4.134 ms
t=# alter materialized view s117_new rename to s117;
ALTER MATERIALIZED VIEW
Time: 1.054 ms
t=# end;
COMMIT
Time: 49.256 ms

检查:

t=# \d+ s117
                              Materialized view "public.s117"
 Column |              Type              | Modifiers | Storage | Stats target | Description
--------+--------------------------------+-----------+---------+--------------+-------------
 now    | timestamp(2) without time zone |           | plain   |              |
View definition:
 SELECT now()::timestamp(2) without time zone AS now;