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;