如何使用postgres在表中的第2列或第3列之后的表中添加新列?

Rol*_*and 57 postgresql

如何使用postgres在表中的第2列或第3列之后的表中添加新列?

我的代码如下所示

ALTER TABLE n_domains ADD COLUMN contract_nr int after owner_id
Run Code Online (Sandbox Code Playgroud)

Mil*_*dev 58

不,没有直接的方法可以做到这一点.并且有一个原因 - 每个查询都应该按照它需要的任何顺序(和格式等)列出它所需的所有字段,从而使得一个表中列的顺序无关紧要.

如果你真的需要这样做我可以想到一个解决方法:

  • 转储并保存相关表的描述(使用pg_dump --schema-only --table=<schema.table> ...)
  • 在保存的定义中添加所需的列
  • 重命名已保存定义中的表,以便在尝试创建时不与旧表的名称冲突
  • 使用此定义创建新表
  • 使用'INSERT INTO <new_table>SELECT field1,field2 <default_for_new_field>,field3,... FROM <old_table>' 填充新表中包含旧表的数据;
  • 重命名旧表
  • 将新表重命名为原始名称
  • 在确保一切正常后,最终放弃旧的,重命名的桌子

  • "每个查询都应该以任何顺序列出它需要的所有字段"→这很容易,只要你永远不必与其他人一起工作. (28认同)
  • 虽然列的顺序可能与使用数据库的应用程序无关.如果在调查表结构或数据时按顺序列出类似的列,则DBA看起来会更好.我个人觉得很烦人,我有几个时间列没有视觉分组,因为它们后来被添加.仅仅因为Postgres不支持在某个位置添加列而重新创建数据库对我来说感觉很奇怪,特别是如果它背后的原因是强迫人们在他们的查询中明确列出列.要明确:我不相信这是原因. (26认同)
  • “不,没有直接的方法可以这样做。这是有原因的。” **根据https://wiki.postgresql.org/wiki/Alter_column_position的说法,这是不正确的**。“允许重新排列列位置的想法并不是Postgresql开发人员所反对的,更多的情况是没有人一步一步地去做这项工作...能够更改列位置的主要原因有两个在postgres中将非常有用:可以通过在表的开头放置固定大小的列来优化物理布局...对列进行排序可以使表的使用更加容易...“另外,67k视图:) (2认同)

小智 27

列的顺序并不相关,将固定宽度列放在表格的前面可以优化数据的存储布局,它还可以使您的数据更容易在应用程序代码之外使用.

PostgreSQL不支持更改列排序(请参阅PostgreSQL wiki上的Alter列位置); 如果表格相对孤立,最好的办法是重新创建表格:

CREATE TABLE foobar_new ( ... );
INSERT INTO foobar_new SELECT ... FROM foobar;
DROP TABLE foobar CASCADE;
ALTER TABLE foobar_new RENAME TO foobar;
Run Code Online (Sandbox Code Playgroud)

如果您对表定义了大量视图或约束,则可以在新列之后重新添加所有列并删除原始列(有关示例,请参阅PostgreSQL wiki).


Eva*_*oll 6

真正的问题是还没有完成。当前,PostgreSQL的逻辑顺序与物理顺序相同。这是有问题的,因为您无法获得不同的逻辑顺序,但是更糟糕的是,由于表并未物理上自动打包,因此通过移动列,您可以获得不同的性能特征。

仅仅出于设计目的而论证这种方式是没有意义的。提交可接受的补丁程序后,某些时候它可能会发生变化。

综上所述,依靠逻辑或物理列的顺序位置是个好主意吗?一定不行。在生产代码中,永远不要使用隐式排序或*。为什么要使代码变得比需要的更脆弱?正确性应始终比保存几次击键优先。

解决方法是,实际上您可以通过重新创建表或通过“添加并重新排序”游戏来修改列顺序

也可以看看,