我对一个非常大的表(近3000万行)上的ALTER TABLE
命令有一个疑问.
ALTER TABLE mytable ALTER COLUMN mycolumn TYPE varchar(40);
如果进程很长,我没有问题,但在ALTER TABLE
命令期间,我的表似乎不再可读.
Note:我使用PostgreSQL 9.0.
我对一个非常大的表(近3000万行)上的ALTER TABLE
命令有一个疑问.
ALTER TABLE mytable ALTER COLUMN mycolumn TYPE varchar(40);
如果进程很长,我没有问题,但在ALTER TABLE
命令期间,我的表似乎不再可读.
Note:我使用PostgreSQL 9.0.
这里有一个关于如何在Resize a column in a PostgreSQL table without changing data岁时做到这一点的描述.你必须破解数据库目录数据.正式做到这一点的唯一方法是使用ALTER TABLE,正如您所注意到的,在运行时,更改将锁定并重写整个表.
在更改之前,请确保阅读文档的Character Types部分.这里有各种奇怪的情况需要注意.当值存储到行中时,将完成长度判断.如果你在那里设置了一个下限,那根本不会减少现有值的大小.明智的做法是扫描整个表,查找字段长度为>;更改后显示40个字符.你需要弄清楚如何手动截断这些锁——所以你在超大的锁上加了一些锁——因为如果有人试图更新那一行上的任何东西,它会因为太大而拒绝它,此时它会存储该行的新版本.用户随后会感到欢笑.
VARCHAR是一种可怕的类型,它存在于PostgreSQL中,只是为了符合SQL标准中与其相关的可怕部分.如果不关心多数据库兼容,考虑将数据存储为文本,并添加约束来限制其长度.您可以在不存在表锁定/重写问题的情况下更改约束,并且它们可以执行比弱长度判断更多的完整性判断.