当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何更改PostgreSQL数据库表中列的位置?》经验,为你挑选了6个好方法。

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

ALTER TABLE person ALTER COLUMN dob POSITION 37;

Bill Karwin.. 97

PostgreSQL Wiki中的" 更改列位置 "说:

PostgreSQL目前根据表的attnum列定义列顺序pg_attribute.更改列顺序的唯一方法是重新创建表,或者通过添加列和旋转数据,直到达到所需的布局.

这非常弱,但在他们的辩护中,在标准SQL中,也没有重新定位列的解决方案.支持更改列的序号位置的数据库品牌定义了SQL语法的扩展.

另一个想法发生在我身上:您可以定义一个VIEW指定列的顺序的方式,而不更改基表中列的物理位置.



1> Bill Karwin..:

PostgreSQL Wiki中的" 更改列位置 "说:

PostgreSQL目前根据表的attnum列定义列顺序pg_attribute.更改列顺序的唯一方法是重新创建表,或者通过添加列和旋转数据,直到达到所需的布局.

这非常弱,但在他们的辩护中,在标准SQL中,也没有重新定位列的解决方案.支持更改列的序号位置的数据库品牌定义了SQL语法的扩展.

另一个想法发生在我身上:您可以定义一个VIEW指定列的顺序的方式,而不更改基表中列的物理位置.


@Kent:令人怀疑的是,postgres开发人员在很大程度上确保了数据的一致性,这肯定适用于pg_dump.毕竟,如果恢复被剔除,那么进行数据库备份的重点是什么?
@Dana:我认为这就是Wiki文章中“重新创建表”的含义。
'转储数据库'::破坏数据的好方法.因此"擦除大量数据库"的效果.

2> Ken..:

这篇文章很老,可能已经解决,但我遇到了同样的问题.我通过创建指定新列顺序的原始表的视图来解决它.

从这里我可以使用视图或从视图中创建一个新表.

    CREATE VIEW original_tab_vw AS
    SELECT a.col1, a.col3, a.col4, a.col2
    FROM original_tab a
    WHERE a.col1 IS NOT NULL --or whatever
    SELECT * INTO new_table FROM original_tab_vw

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


好的解决方案,但只复制数据类型(没有主键等)
这似乎是一个非常合理的解决方案.太糟糕了,没有任何GUI工具可以自动执行此过程.

3> Ville..:

一个,虽然在必须绝对更改列顺序时重新排列列的笨拙选项,并且正在使用外键,但是首先使用数据转储整个数据库,然后仅转储schema(pg_dump -s databasename > databasename_schema.sql).接下来,编辑模式文件以根据需要重新排列列,然后从模式重新创建数据库,最后将数据还原到新创建的数据库中.


实际上,当表是另一个表中的外键时,这是一个很好的解决方案。所有其他解决方案在此方案中均不起作用。最后,使用pg_dump --column-inserts -s databasename> databasename_schema.sql

4> 小智..:

在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;


哇,这太好了,我相信这应该是公认的答案!

5> Mike Woodhou..:

我认为你目前不能:在Postgresql维基上看到这篇文章.

本文的三个解决方法是:

    重新创建表格

    添加列并移动数据

    隐藏视图中的差异.



6> 小智..:

在PGAdmin中打开表,并在底部的SQL窗格中复制SQL Create Table语句.然后打开查询工具并粘贴.如果表有数据,请将表名更改为"new_name",否则,删除"删除表"行中的注释" - ".根据需要编辑列序列.记住最后一栏中丢失/多余的逗号,以防你移动它.执行新的SQL Create Table命令.刷新......瞧.

对于设计阶段的空表,这种方法非常实用.

如果表有数据,我们也需要重新排列数据的列序列.这很简单:用于INSERT将旧表导入其新版本:

INSERT INTO new ( c2, c3, c1 ) SELECT * from old;

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

在检查DROP完所有之后,旧表并将"新"名称更改为"旧"使用ALTER TABLE new RENAME TO old;,您就完成了.

推荐阅读
yzh148448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有