我不想通过
将列的大小从字符(9)更改为字符(12)ALTER TABLE product_based_award ALTER COLUMN name TYPE character(12);
但是内部此列由MView使用,因此不允许更改表并给出以下错误。
错误:无法更改视图或规则使用的列的类型
我找到了两个解决方案,一个是删除mview并重新创建它,另一个是更新pg_attribute。 但我不能使用这两个选项,因为我们的数据库非常复杂,因此更新pg_attribute会导致问题,也不能丢弃mview。
还有其他最好的方法来解决这个问题。
答案 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;