id | name | created_date
,并且想添加一列,我使用:
alter table my_table add column email varchar(255)
然后将该列添加到
created_date
列之后。有什么方法可以指定新列的位置?例如所以我可以在
name
之后添加它,并得到一个像这样的表:id | name | email | created_date
#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);
评论
不需要这样做。只需按照您想要的顺序将它们放入选择语句中即可。@jonas,因此您还可以创建一个按此顺序显示视图的视图...从技术上讲,列的位置无关紧要,因为您可以在查询中以任何顺序定义它们...而且通常不应该这样做选择*
@a_horse:嗯,当列有许多不同的顺序时,使用表(作为开发人员/管理员)要困难得多。当我在一个表中有15列时,我真的更喜欢在所有数据库中以相同的顺序排列它们。
@jonas可以在进行插入和更新时定义列名称,从而使顺序不相关。
@Jonas:然后编写自己的\ d替代项,以所需顺序报告列(这只是对系统表的查询:请尝试使用psql -E开关查看实际查询)