【发布时间】:2017-10-23 21:18:54
【问题描述】:
我有一个“父表”和分区表,其中包含很多列,现在我需要将列 VARCHAR(32) 更改为 TEXT,因为我们需要更大的长度灵活性。
所以我会更改父级,他们也会更改所有分区。
但该表有 2 个与该列有关的唯一索引,还有 1 个索引。
此查询锁定表:
ALTER TABLE my_schema.my_table
ALTER COLUMN column_need_change TYPE VARCHAR(64) USING
column_need_change :: VARCHAR(64);
还有这个:
ALTER TABLE my_schema.my_table
ALTER COLUMN column_need_change TYPE TEXT USING column_need_change :: TEXT;
我看到了这个解决方案:
UPDATE pg_attribute SET atttypmod = 64+4
WHERE attrelid = 'my_schema.my_table'::regclass
AND attname = 'column_need_change ';
但我不喜欢这个解决方案。
如何在不锁表的情况下将VARCHAR(32)类型改为TEXT,我需要在更新之间继续推送一些表中的数据。
我的 Postgresql 版本:9.6
编辑:
这是我最终采取的解决方案:
ALTER TABLE my_schema.my_table
ALTER COLUMN column_need_change TYPE TEXT USING column_need_change :: TEXT;
查询将我的表锁定在 1m 52s 548ms 之间,260 万行,但没关系。
【问题讨论】: