我有一个“父表”,按年份分区,并且还有很多列,现在我需要将一个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;
查询锁定了我的表,耗时1分52秒548毫秒,涉及260万行数据,但是没问题。
varchar(20)
到varchar(500)
,Oracle和SQL Server也不会重写表格(或任何索引)。 - user330315varchar(max)
并不像text
一样被鼓励作为默认值。 - IMSoP