我尝试了以下,但我没有成功:
ALTER TABLE person ALTER COLUMN dob POSITION 37;
Bill Karwin.. 97
PostgreSQL Wiki中的" 更改列位置 "说:
PostgreSQL目前根据表的
attnum
列定义列顺序pg_attribute
.更改列顺序的唯一方法是重新创建表,或者通过添加列和旋转数据,直到达到所需的布局.
这非常弱,但在他们的辩护中,在标准SQL中,也没有重新定位列的解决方案.支持更改列的序号位置的数据库品牌定义了SQL语法的扩展.
另一个想法发生在我身上:您可以定义一个VIEW
指定列的顺序的方式,而不更改基表中列的物理位置.
PostgreSQL Wiki中的" 更改列位置 "说:
PostgreSQL目前根据表的
attnum
列定义列顺序pg_attribute
.更改列顺序的唯一方法是重新创建表,或者通过添加列和旋转数据,直到达到所需的布局.
这非常弱,但在他们的辩护中,在标准SQL中,也没有重新定位列的解决方案.支持更改列的序号位置的数据库品牌定义了SQL语法的扩展.
另一个想法发生在我身上:您可以定义一个VIEW
指定列的顺序的方式,而不更改基表中列的物理位置.
这篇文章很老,可能已经解决,但我遇到了同样的问题.我通过创建指定新列顺序的原始表的视图来解决它.
从这里我可以使用视图或从视图中创建一个新表.
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
重命名或删除原始表,并将新表的名称设置为旧表.
一个,虽然在必须绝对更改列顺序时重新排列列的笨拙选项,并且正在使用外键,但是首先使用数据转储整个数据库,然后仅转储schema(pg_dump -s databasename > databasename_schema.sql
).接下来,编辑模式文件以根据需要重新排列列,然后从模式重新创建数据库,最后将数据还原到新创建的数据库中.
在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;
我认为你目前不能:在Postgresql维基上看到这篇文章.
本文的三个解决方法是:
重新创建表格
添加列并移动数据
隐藏视图中的差异.
在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;
,您就完成了.