如何修改PostgreSQL数据库表中列的位置?

我已经尝试了以下,但我没有成功:

ALTER TABLE person ALTER COLUMN dob POSITION 37; 

PostgreSQL Wiki中的“ 改变列位置 ”说:

PostgreSQL当前基于pg_attribute表的attnum列定义列顺序。 更改列顺序的唯一方法是重新创build表格,或者添加列和旋转数据,直到达到所需的布局。

这是相当薄弱的,但在他们的辩护,在标准的SQL,也没有解决scheme重新定位列。 支持更改列的顺序位置的数据库品牌正在定义对SQL语法的扩展。

另外一个想法是:我可以定义一个VIEW来指定列的顺序,而不改变基表中列的物理位置。

这篇文章是旧的,可​​能解决了,但我有同样的问题。 我通过创build指定新列顺序的原始表的视图来解决它。

从这里我可以使用视图或从视图中创build一个新的表。

     CREATE VIEW original_tab_vw AS
     SELECT a.col1,a.col3,a.col4,a.col2
     FROM original_tab a
    在哪里a.col1不是NULL  - 或者任何
     SELECT * INTO new_table FROM original_tab_vw

重命名或删除原始表,并将新表的名称设置为旧表。

我不认为你可以在目前: 在Postgresql维基上看到这篇文章 。

本文的三个解决方法是:

  1. 重新创build表格
  2. 添加列和移动数据
  3. 用视图隐藏差异。

其中之一是,当列顺序必须绝对改变,并且外键正在使用时,重新排列列的笨拙select是首先使用数据转储整个数据库,然后仅转储模式( pg_dump -s databasename > databasename_schema.sql )。 接下来,编辑模式文件以按需要重新排列列,然后从模式中重新创build数据库,最后将数据恢复到新创build的数据库中。

在PostgreSQL中,当添加一个字段时,它将被添加到表的末尾。 如果我们需要插入特定的位置,那么

 alter table tablename rename to oldtable; create table tablename (column defs go here); insert into tablename (col1, col2, col3) select col1, col2, col3 from oldtable; 

在PGAdmin中打开表格,在底部的SQL窗格中复制SQL Create Table语句。 然后打开查询工具并粘贴。 如果表中有数据,请将表名更改为“new_name”,否则请删除Drop Table行中的注释“ – ”。 根据需要编辑列序列。 请注意最后一列中遗漏的/多余的逗号,以免移动它。 执行新的SQL创build表命令。 刷新和…voilà。

对于devise阶段的空表而言,这种方法非常实用。

如果表中有数据,我们也需要重新排列数据的列顺序。 这很简单:使用INSERT将旧表导入到新版本

INSERT INTO新(c2,c3,c1)从旧的SELECT *;

其中c2,c3,c1是旧表在新位置的列c1,c2,c3。 请注意,在这种情况下,您必须对已编辑的“旧”表使用“新名称 ”,否则您将丢失数据 。 如果列名很多,长和/或复杂,则使用与上述相同的方法将新的表结构复制到文本编辑器中,然后在将其复制到INSERT语句之前创build新列列表。

检查一切正常后,使用ALTER TABLE new RENAME TO old删除旧表,并将“new”名称更改为“old”; 你完成了。