Postgresql – 更改varchar列的大小

我有一个关于ALTER TABLE命令在一个真正的大表(几乎3000万行)的问题。
它的一个列是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,并添加约束以限制其长度。约束你可以改变没有这个表锁/重写问题,他们可以做更多的完整性检查,而不仅仅是弱长度检查。

相关文章

项目需要,有个数据需要导入,拿到手一开始以为是mysql,结果...
本文小编为大家详细介绍“怎么查看PostgreSQL数据库中所有表...
错误现象问题原因这是在远程连接时pg_hba.conf文件没有配置正...
因本地资源有限,在公共测试环境搭建了PGsql环境,从数据库本...
wamp 环境 这个提示就是说你的版本低于10了。 先打印ph...
psycopg2.OperationalError: SSL SYSCALL error: EOF detect...