Postgres カラムを指定の位置に追加する

新テーブル作成後、元テーブルからデータ移行

foo_nameとfoo_categoryの間にカラムを追加する。

pgdb=# \d foo テーブル "public.foo" 列 | 型 | 修飾語 --------------+---------+---------- foo_id | integer | not null foo_name | text | not null foo_category | integer | foo_flg | boolean | pgdb=# \d リレーションの一覧 スキーマ | 名前 | 型 | 所有者 ----------+-------+----------+---------- public | foo | テーブル | postgres (2 行)

ADD COLUMNで新規カラムを追加できるが、位置指定できないので以下の通りに設定。

SQL

--新規カラムを追加したテーブルを作成 CREATE TABLE foo_new ( foo_id integer NOT NULL, foo_name text NOT NULL, foo_type text, --新規カラム foo_category text, foo_flg boolean );
pgdb=# \d foo_new テーブル "public.foo_new" 列 | 型 | 修飾語 --------------+---------+---------- foo_id | integer | not null foo_name | text | not null foo_type | text | foo_category | text | foo_flg | boolean |

元テーブルから新テーブルにデータを移行し、元テーブルと新テーブルをそれぞれリネームする。

SQL

--元テーブルから新テーブルにデータ移行 INSERT INTO foo_new (foo_id, foo_name, foo_category, foo_flg) SELECT foo_id, foo_name, foo_category, foo_flg FROM foo; --元テーブルをリネーム ALTER TABLE foo RENAME TO foo_old; --新テーブルをリネーム ALTER TABLE foo_new RENAME TO foo;

トランザクション内で実行する。

pgdb=# BEGIN; BEGIN pgdb=# INSERT INTO foo_new (foo_id,foo_name,foo_category,foo_flg) pgdb-# SELECT foo_id,foo_name,foo_category,foo_flg FROM foo; INSERT 0 5 pgdb=# ALTER TABLE foo RENAME TO foo_old; ALTER TABLE pgdb=# ALTER TABLE foo_new RENAME TO foo; ALTER TABLE pgdb=# \d foo テーブル "public.foo" 列 | 型 | 修飾語 --------------+---------+---------- foo_id | integer | not null foo_name | text | not null foo_type | text | foo_category | text | foo_flg | boolean | pgdb=# \d リレーションの一覧 スキーマ | 名前 | 型 | 所有者 ----------+---------+------------+---------- public | foo | テーブル | postgres public | foo_old | テーブル | postgres (2 行) pgdb=# COMMIT; COMMIT

元テーブルが不要であれば削除する。

SQL

--元テーブルを削除 DROP TABLE foo_old;

最新の記事

プロフィール

流されるままにウェブ業界で仕事しています。主にLAPP環境でPHPを書いています。最近はjQueryで遊んでいます。
※動作確認について