postgresql - ALTER TABLE 在有限的磁盘空间上添加新列

标签 postgresql alter-table

我有一个关于操作我的主表的问题:我需要在其中添加一个新列,但是已经有超过 5000 万个条目要更新。
如果我不将我的数据存储在已经被数据库填充了一半以上的小型 ssd 上,它就像更改表一样简单。
更改表无法完成,因为它创建了表的副本,然后才替换原始表。

我的 ssd 驱动器无法容纳两个副本,那么是否可以直接在原始表上操作,或者使用另一个驱动器作为临时表? 或者我应该使用另一台计算机在更大的驱动器上更改我的表,然后只传输回我的 ssd 服务器?

提前致谢!

PS:时间不是真正的问题,它是一个几乎没有用户的 alpha 非实时系统,所以我可以在几个小时内记下所有内容(感谢互联网之神!)

最佳答案

如果列没有 DEFAULT 并且为空,则 PostgreSQL 可以就地执行 ADD COLUMN

因此:使用与在高并发情况下处理它时使用的方法相同的方法,但不使用在并发情况下处理它时使用的触发器。

  • ALTER TABLE ... ADD COLUMN ... 没有任何 DEFAULTNOT NULL
  • ALTER TABLE ... ALTER COLUMN ... DEFAULT ... 添加 DEFAULT(如果有的话)
  • UPDATE 对表中的行批量设置值。 VACUUM 每批之间的表。不要使用VACUUM FULL。每个批处理必须是一个新的、单独的事务,在 VACUUM 之前提交。
  • 如果需要,ALTER TABLE ... ALTER COLUMN ... NOT NULL 在所有行都设置了值之后

关于postgresql - ALTER TABLE 在有限的磁盘空间上添加新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33768823/

相关文章:

java - 以编程方式访问 PostgreSQL 异常

postgresql - 如何避免提示PostgreSQL密码?

MySQL - 如果列为 NULL,则生成随机唯一代码

mysql - 有什么方法可以检测何时在 MySQL 中执行 ALTER TABLE 语句?

MYSQL 约束 - 多重检查

使用 alter table 命令创建 MySQL 外键

mysql - MySQL 中的默认排序顺序(ALTER TABLE ... ORDER BY ...;)

python - 你如何使 Python/PostgreSQL 更快?

postgresql - 为什么我在插入 postgres 后得到 ErrNoRows ("sql: no rows in result set"),即使插入实际上是成功的?

sql - 为什么我的基于 postgis ST_Intersects 和 ST_Azimuth 的查询很慢?