PostgreSQLでカラム名を任意の位置に追加する

バックアップして削除して作り直してリストアする。

logテーブルを例に挙げる



CREATE TABLE log ( log_id SERIAL NOT NULL, customer_id varchar(32) NOT NULL, message TEXT DEFAULT '', created_at timestamp NOT NULL, PRIMARY KEY (log_id) ) ;

customer_idの下にtitle varchar(32) NOT NULLを追加する。


対象テーブルのバックアップを作成



テーブル名だけ変更したテーブルを作成する。
データの中身だけ保持しておきたいので、インデックスやコメント等は不要。
主キー、外部キーも不要。
CREATE TABLE log_bk ( log_id SERIAL NOT NULL, customer_id varchar(32) NOT NULL, message TEXT DEFAULT '', created_at timestamp NOT NULL, PRIMARY KEY (log_id) ) ;



バックアップテーブルへ全データコピー



Insert Into log_bk ( Select * From log )



元のテーブルを削除



Drop Table log;

外部キー等を設定している場合は該当テーブルのバックアップを取っておくか一時的に外部キー制約を削除する。
特にON DELETE CASCADEを指定している場合は注意が必要。まとめて消えてしまう。


変更後のテーブルを再作成



CREATE TABLE log ( log_id SERIAL NOT NULL, customer_id varchar(32) NOT NULL, title varchar(32) NOT NULL, message TEXT DEFAULT '', created_at timestamp NOT NULL, PRIMARY KEY (log_id) ) ; create index log_customer on log ( customer_id ); COMMENT ON TABLE log IS 'ログ';

主キー、外部キー、インデックス等も含むこと。


データリストア



Insert Into log ( Select log_id, customer_id, '' As title, message, contents, created_at From notice_log_bk )

外部キー制約を元に戻す。


バックアップ削除



Drop Table log_bk;



シーケンスの更新



以降は補足。
SERIAL型を使用している場合Sequenceが1に戻っている(追加時に連番が1から始まる)ので必要に応じて更新する。

シーケンス名確認

シーケンスの命名規則はテーブル名+カラム名+seqを_でつないだ形。
SELECT col.column_name , col.data_type , col.column_default FROM information_schema.columns col WHERE col.table_name = 'log'
col.table_name = 'log'でテーブル名を指定。
column_default値にシーケンス情報が載っている。
nextval('log_log_id_seq'::regclass)といった値が確認できる。
その他pgadminなどでCreate文を確認するとSERIALがシーケンスを使用するように置き換わっている。

シーケンス値確認

select nextval('log_log_id_seq');
取得できた値でシーケンス値を更新すれば良い。

その他シーケンスの更新値確認(元のテーブルを削除した場合など)

うっかり元のシーケンスがわからなくなってしまっても現在の連番の最大値+1でシーケンスを更新すれば問題はなくなる。
SELECT * FROM public.log ORDER BY log_id Desc;
SERIAL型のカラムの最大値+1を設定すれば良い。

シーケンス値更新

ALTER SEQUENCE log_log_id_seq RESTART WITH 3036;





参考



https://wiki.postgresql.org/wiki/Alter_column_position/ja#.E5.88.97.E3.82.92.E8.BF.BD.E5.8A.A0.E3.81.97.E3.83.87.E3.83.BC.E3.82.BF.E3.82.92.E7.A7.BB.E5.8B.95



2021年2月17日水曜日