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


74

列がある表がある場合:

id | name | created_date

列を追加したい場合、私は使用します:

alter table my_table add column email varchar(255)

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

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

id | name | email | created_date

4
それをする必要はありません。それらを必要な順序でselectステートメントに入れるだけです。
-a_horse_with_no_name

@jonasですのでview、その順序でショーを作成することもできます...技術的には、クエリで任意の順序で列を定義できるため、列の位置は重要ではありません...select *
xenoterracide

2
@a_horse:さて、列にさまざまな順序がある場合、(開発者/管理者として)テーブルを操作するのははるかに困難です。テーブルに15個の列がある場合、すべてのデータベースで同じ順序で列を配置することを本当に好みます。
ジョナス

2
@jonasでは、挿入および更新を行うときに列名を定義できるため、順序を無関係にすることができます。
xenoterracide

2
@Jonas:次に、必要な順序で列を報告する\ dの独自の代替を記述します(システムテーブルに対するクエリのみです。psql -E実際のクエリを表示するにはスイッチを使用してみてください)
Jack Douglas

回答:


54

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



4
そうです..しかし、誰かが本当にこの方法を使用していますか?:
マリアン

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);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.