更改表架构需要太多时间

Sri*_*thy 6 postgresql alter-table

我正在使用 PostgreSQL 数据库。

我有一个包含数百万行的表。我有一个varchar大小为 2000的列,我想将其设置为 4000。我运行了该alter table命令,但它花费了太多时间。

有没有更快的方法来做到这一点?

kgr*_*ttn 12

是的,如果您使用的是 9.1 版,则有一种更快的方法。在PostgreSQL的版本9.1版本说明包括如下:

允许 ALTER TABLE ... SET DATA TYPE 避免在适当情况下重写表(Noah Misch、Robert Haas)

例如,将 varchar 列转换为文本不再需要重写表。但是,增加 varchar 列的长度约束仍然需要重写表。

这方面的进一步改进将在 9.2 版中推出,该版本将于下周发布测试版。但是现在看来,更快的方法是将类型更改为text,在这种情况下,它可以快速更新系统表,而不会更改堆。


Erw*_*ter 7

几乎没有什么好的理由使用数据类型character varying (n)(更不用说更糟糕的了char(n))。没有什么比数据类型更好的了textvarchar是在计算机系统仍然无法处理可变长度字符串的时候发明的。如今,它只是为了与标准和旧应用程序兼容。使用text ,而不是-或varchar无长改性剂(其被相同地实现)。

如果您需要强制执行最大长度,请添加如下检查约束

ALTER TABLE tbl ADD CONSTRAINT tbl_col_len CHECK (length(col) < 4000);
Run Code Online (Sandbox Code Playgroud)

您可以删除并重新创建具有不同最大长度的此约束,而无需重新编写表。

text在阅读@kgrittn 的回答中的好消息后,首先转换为PostgreSQL 9.1 免费提供。