web-dev-qa-db-ja.com

PostgreSQLの新しい列の位置を指定するにはどうすればよいですか?

列を持つテーブルがある場合:

id | name | created_date

列を追加したいので、次を使用します。

alter table my_table add column email varchar(255)

次に、列がcreated_date列の後に追加されます。

新しい列の位置を指定する方法はありますか?例えばnameの後に追加して、次のようなテーブルを取得できます。

id | name | email | created_date
85
Jonas

ALTER TABLE ADD COLUMNは、最後の列として、最後に新しい列のみを追加します。別の位置に新しい列を作成するには、テーブルを再作成し、この新しいテーブルの古い/現在のテーブルからデータをコピーする必要があります。

62
Marian

特定の順序が必要な場合は、テーブルを再作成する必要があります。次のようなことをしてください:

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;

必要に応じてインデックスを作成します。

24
Scott Marlowe

見た目だけにしたい場合は、テーブルごとにビューを希望の列の順序で保持し、テーブルではなくビューから選択する方が簡単だと思います。

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);
3