我有一个关于操作我的主表的问题:我需要在其中添加一个新列,但是已经有超过 5000 万个条目要更新。
如果我不将我的数据存储在已经被数据库填充了一半以上的小型 ssd 上,它就像更改表一样简单。
更改表无法完成,因为它创建了表的副本,然后才替换原始表。
我的 ssd 驱动器无法容纳两个副本,那么是否可以直接在原始表上操作,或者使用另一个驱动器作为临时表? 或者我应该使用另一台计算机在更大的驱动器上更改我的表,然后只传输回我的 ssd 服务器?
提前致谢!
PS:时间不是真正的问题,它是一个几乎没有用户的 alpha 非实时系统,所以我可以在几个小时内记下所有内容(感谢互联网之神!)
最佳答案
如果列没有 DEFAULT
并且为空,则 PostgreSQL 可以就地执行 ADD COLUMN
。
因此:使用与在高并发情况下处理它时使用的方法相同的方法,但不使用在并发情况下处理它时使用的触发器。
ALTER TABLE ... ADD COLUMN ...
没有任何DEFAULT
或NOT 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/