我有一个关于ALTER TABLE命令在一个真正的大表(几乎3000万行)的问题。
它的一个列是varchar(255),我想调整为varchar(40)。
基本上,我想通过运行以下命令更改我的列:
它的一个列是varchar(255),我想调整为varchar(40)。
基本上,我想通过运行以下命令更改我的列:
ALTER TABLE mytable ALTER COLUMN mycolumn TYPE varchar(40);
我没有问题,如果进程很长,但似乎我的表在ALTER TABLE命令中不再可读。
有更聪明的方式吗?也许添加一个新列,从旧列复制值,删除旧列,最后重命名新的?
任何线索将非常感谢!
提前致谢,
注意:我使用Postgresql 9.0。
有一个如何做到这一点的描述在
Resize a column in a PostgreSQL table without changing data.你必须破解数据库目录数据。唯一的方法是使用ALTER TABLE,并且你已经注意到,更改将在整个表运行时锁定和重写整个表。
请务必在更改此文档之前阅读文档的Character Types部分。各种奇怪的情况都要在这里注意。当值存储到行中时,将进行长度检查。如果你在那里有一个下限,这不会减少现有的值的大小。在进行更改后,对整个表执行扫描,查找字段长度大于40个字符的行,这样做是明智的。你需要找出如何手动截断这些,所以你回到一些锁只是在超大的 – 因为如果有人试图更新任何东西在那行,它会拒绝它太大现在,在点它去存储新版本的行。随之而来的是用户的欢笑。
VARCHAR是一种可怕的类型,它存在于Postgresql中,只是为了符合其相关的可怕的sql标准部分。如果您不关心多数据库兼容性,请考虑将您的数据存储为TEXT,并添加约束以限制其长度。约束你可以改变没有这个表锁/重写问题,他们可以做更多的完整性检查,而不仅仅是弱长度检查。