Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 更改表以在有限的磁盘空间上添加新列_Postgresql_Alter Table - Fatal编程技术网

Postgresql 更改表以在有限的磁盘空间上添加新列

Postgresql 更改表以在有限的磁盘空间上添加新列,postgresql,alter-table,Postgresql,Alter Table,我有一个关于操作主表的问题:我需要向其中添加一个新列,但是已经有5000多万个条目需要更新。 如果我不将数据存储在一个小型ssd上,而这个ssd已经被数据库填满了一半多一点,那么这就像一个alter表一样简单。 alter表格无法完成,因为它创建了表格的一个副本,然后才替换原始表格 我的ssd驱动器上无法安装两个副本,因此是否可以直接在原始表上操作,或使用另一个驱动器作为临时表? 或者我应该使用另一台计算机在更大的驱动器上更改我的表,然后只传输回我的ssd服务器 提前谢谢 PS:时间不是一个真正

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

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

提前谢谢


PS:时间不是一个真正的问题,它在alpha中是一个几乎没有用户的非实时系统,所以我可以在几个小时内把所有东西都取下来(感谢互联网上的上帝!)

根据我的快速谷歌搜索,Postgres不支持inplace
add column
。由于时间对您来说不是问题,您可以通过使用新架构创建新表,然后使用插入将前100000行从旧表复制到新表来模拟inplace
add column
。。。选择,然后从旧表中删除前100000行[1],并重复此过程,直到复制整个表。最后,只需删除旧表并重命名新表。这样,空间开销将始终保持不变


[1]

如果列没有默认值且为空,则PostgreSQL可以就地添加列

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

  • altertable。。。添加列…
    不带任何
    默认值
    非空
  • altertable。。。更改列。。。默认…
    添加
    默认值
    如果有
  • UPDATE
    成批更新表格以设置值<代码>真空每批之间的表格。请勿使用
    全真空
    。每个批都必须是一个新的、单独的事务,在
    真空
    之前提交
  • 如果需要,
    altertable。。。更改列。。。所有行都设置了值后不为空

所以正确的术语是“就地”,很好,现在我有了名字!我目前正在更新表格,需要一段时间,但看起来不错,谢谢你的回答!然而,我想知道,如果我想在列上添加一个索引,它会发生吗?似乎不需要复制表来创建索引是合乎逻辑的,但我仍然只是想确定一下。@Wiz在PostgreSQL术语中,我们通常谈论避免完全重写表。不,索引不需要重写整个表。