[PostgreSQL] ALTER文でserial型に変えることはできないみたい。

ALTER TABLE tablename ALTER colname TYPE serial;
ERROR:  type "serial" does not exist
integerで定義したものを後からserialに変更することはできないようです。
そもそもserialは「型」ではなくて、「create tableする際のマクロというか呪文のようなもの」だからでしょうか。
(実際、CREATE TABLE文でserial型を指定したとき、作成された列の型はintegerになります。)

既存のカラムをserialに変更したい場合

既存の列をあとからserialにしたいときは、下記のように手動でシーケンスを作って対処するしかないようです。
CREATE SEQUENCE tablename_colname_seq;
ALTER TABLE tablename ALTER  colname SET DEFAULT nextval('tablename_colname_seq');
ALTER SEQUENCE tablename_colname_seq OWNED BY tablename.colname;
途中からシーケンスを使う場合は、連番の値を進めておくのを忘れずに。
例えば既存のデータの連番が100で終っている場合はこのようにします。
SELECT setval('tablename_colname_seq', 100);
詳細はシーケンスについての公式マニュアルをご覧ください。
http://www.postgresql.jp/document/current/html/datatype-numeric.html#DATATYPE-SERIAL
http://www.postgresql.jp/document/current/html/functions-sequence.html
カテゴリ: