如何在PostgreSQL中为新列指定位置?


74

如果我有带有列的表:

id | name | created_date

并想添加一列,我使用:

alter table my_table add column email varchar(255)

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

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

id | name | email | created_date

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

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

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

2
@jonas可以在进行插入和更新时定义列名称,从而使顺序无关紧要。
xenoterracide 2011年

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

Answers:


54

ALTER TABLE ADD COLUMN只会在最后添加新列,作为最后一列。为了在其他位置创建新列,您需要重新创建表并从该新表中的旧表/当前表中复制数据。



4
没错..但是有人真的使用这种方法吗?:-)
玛丽安(Marian)

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

22

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

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;

根据需要创建索引等


2

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

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);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.