Postgresql - 将varchar列的大小更改为较小的长度
Postgresql - 将varchar列的大小更改为较小的长度
我有一个关于ALTER TABLE
命令的问题,针对的是一个非常大的表(近3000万行)。
其中一个列是varchar(255)
,我想将其调整为varchar(40)
。
基本上,我想通过运行以下命令来更改我的列:
ALTER TABLE mytable ALTER COLUMN mycolumn TYPE varchar(40);
如果此过程非常长,我没有问题,但在ALTER TABLE
命令期间,我的表似乎不再可读。
有没有更明智的方法?也许添加一个新列,从旧列复制值,删除旧列,最后重命名新列?
注意:我使用的是PostgreSQL 9.0。
admin 更改状态以发布 2023年5月19日
在调整PostgreSQL表中列的大小而不改变数据中,有关如何执行此操作的说明。你需要修改数据库目录数据。官方唯一的方法是使用 ALTER TABLE,如你所见,这个修改将在运行时锁定并重写整个表。
在更改之前务必阅读文档中的字符类型部分。有许多奇怪的情况需要注意。当将值存储到行中时,会进行长度检查。如果你将较低的限制写在这里,这将不会减少现有值的大小。在修改后,您应该对整个表进行扫描,查找字段长度>40个字符的行。在手动截断这些行时需要谨慎,因为如果有人尝试更新该行中的任何内容,该更新会被拒绝,因为已经超出了长度限制。这将会给用户带来不便。
VARCHAR是PostgreSQL中存在的一种可怕的类型,只是为了符合SQL标准中相关的可怕部分。如果您不关心多个数据库的兼容性,请将数据存储为TEXT,并添加约束来限制其长度。您可以更改约束,而无需进行表的锁定/重写问题,并且它们可以进行比弱长度检查更多的完整性检查。
在PostgreSQL 9.1中有一种更简单的方法。 http://www.postgresql.org/message-id/162867790801110710g3c686010qcdd852e721e7a559@mail.gmail.com \n
CREATE TABLE foog(a varchar(10)); ALTER TABLE foog ALTER COLUMN a TYPE varchar(30); postgres=# \d foog Table "public.foog" Column | Type | Modifiers --------+-----------------------+----------- a | character varying(30) |