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