我对一个非常大的表(近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标准中与其相关的可怕部分.如果不关心多数据库兼容,考虑将数据存储为文本,并添加约束来限制其长度.您可以在不存在表锁定/重写问题的情况下更改约束,并且它们可以执行比弱长度判断更多的完整性判断.

Sql相关问答推荐

在SELECT陈述中使用子查询提高查询性能

在数据分区内执行确定

如何从多行数据中获取一行合并数据?

R中对Arrow duckdb工作流的SQL查询

使用sede获取不一定有两个不同标签的所有问题

Oracle SQL-将结果列在单行中

基于唯一值在Access查询中创建计数器

如何查找所提供日期范围的所有季度开始日期和结束日期

使用Kotlin Exposed SQL DSL Select 多个值并排序

使用DatePart函数对日期时间值进行分组

Oracle分层查询-两条路径在末尾合并为一条

在SQL中,筛选其他列中只有一个值的ID

统计重复记录的总数

PostgreSQL:从多个字段收集特定指标的最后一个条目

使用多个数据库调用重载 CQRS 模式

如何为给定的股票数据集计算利润/亏损,确保先卖出先买入的股票

PostgreSQL分割字符串为子词并判断其是否存在于其他字符串中

从每行中排除最大元素

如何根据另一列对行值进行分组?

当没有任何行存在时,将一个表中的行插入到另一个表中的更好方法