Postgresql - 将varchar列的大小更改为较小的长度

42 浏览
0 Comments

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日
0
0 Comments

调整PostgreSQL表中列的大小而不改变数据中,有关如何执行此操作的说明。你需要修改数据库目录数据。官方唯一的方法是使用 ALTER TABLE,如你所见,这个修改将在运行时锁定并重写整个表。

在更改之前务必阅读文档中的字符类型部分。有许多奇怪的情况需要注意。当将值存储到行中时,会进行长度检查。如果你将较低的限制写在这里,这将不会减少现有值的大小。在修改后,您应该对整个表进行扫描,查找字段长度>40个字符的行。在手动截断这些行时需要谨慎,因为如果有人尝试更新该行中的任何内容,该更新会被拒绝,因为已经超出了长度限制。这将会给用户带来不便。

VARCHAR是PostgreSQL中存在的一种可怕的类型,只是为了符合SQL标准中相关的可怕部分。如果您不关心多个数据库的兼容性,请将数据存储为TEXT,并添加约束来限制其长度。您可以更改约束,而无需进行表的锁定/重写问题,并且它们可以进行比弱长度检查更多的完整性检查。

0
0 Comments

在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) |

0