如果我有一个带有列的表:

id | name | created_date


,并且想添加一列,我使用:

alter table my_table add column email varchar(255)


然后将该列添加到created_date列之后。

有什么方法可以指定新列的位置?例如所以我可以在name之后添加它,并得到一个像这样的表:

id | name | email | created_date


评论

不需要这样做。只需按照您想要的顺序将它们放入选择语句中即可。

@jonas,因此您还可以创建一个按此顺序显示视图的视图...从技术上讲,列的位置无关紧要,因为您可以在查询中以任何顺序定义它们...而且通常不应该这样做选择*

@a_horse:嗯,当列有许多不同的顺序时,使用表(作为开发人员/管理员)要困难得多。当我在一个表中有15列时,我真的更喜欢在所有数据库中以相同的顺序排列它们。

@jonas可以在进行插入和更新时定义列名称,从而使顺序不相关。

@Jonas:然后编写自己的\ d替代项,以所需顺序报告列(这只是对系统表的查询:请尝试使用psql -E开关查看实际查询)

#1 楼

ALTER TABLE ADD COLUMN只会在末尾添加新列,作为最后一个列。
要在另一个位置创建新列,您需要重新创建表并在此新表中复制旧/当前表中的数据。

评论


“或通过添加列和旋转数据直到达到所需的布局”

–杰克·道格拉斯(Jack Douglas)
2011年6月13日8:08



是的..但是有人真的使用这种方法吗? :-)

–玛丽安
2011年6月15日7:25

如果比重新创建表和所有子表,外键和授权更容易:)我认为该链接可能有用,因为它提供了为什么不能指定位置的解释,并希望可以在列表中实现。未来版本。

–杰克·道格拉斯(Jack Douglas)
2011-06-15 8:49



@JackDouglas和8年后的今天,我可能会被迫使用这种确切的方法!爱你,老兄!

–玛丽安
1月9日15:02

我猜我对此仍然有用!如果您有兴趣的话,似乎要在2015年取得最新进展。

–杰克·道格拉斯(Jack Douglas)
1月9日18:10

#2 楼

如果需要特定顺序,则需要重新创建表。只需执行以下操作即可:

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


根据需要创建索引等。

#3 楼

如果您只想从外观上看,我发现更容易为每个表保留一个具有所需列顺序的视图,然后从中选择而不是表。

create table my_table (
create view view_my_table as
  select id, name, created_date from my_table;

-- adding a new column
begin;
alter table my_table add column email varchar(255);
drop view view_my_table;
create view view_my_table as
  select id, name, email, created_date from my_table;
commit;


出于所有其他目的(例如插入,联合),最好始终指定列列表。

-- bad
insert into my_table values (...);
(select * from my_table)
  union all
(select * from my_table);

-- good
insert into my_table (id, name, email, created_date) values (...);
(select id, name, email, created_date from my_table)
  union all
(select id, name, email, created_date from my_table);