大した話ではないし、PostgreSQL のドキュメントにも記載があることなので、わざわざここでメモるほどのことではないのだが、うっかりエラーを出してドキっとしたので書いておく。
PostgreSQL で、既存テーブルに列を追加し、NOT NULL にする手順。
例えば、hoge テーブルに、chin と man という列を追加するのなら、以下の SQL を実行する。
ALTER TABLE hoge ADD COLUMN chin VARCHAR(1);
ALTER TABLE hoge ADD COLUMN man VARCHAR(1);
これでテーブルの末尾に上記2つの列が追加されるが、NULL も許可する形で作られている。
ADD COLUMN では、
ALTER TABLE hoge ADD COLUMN chin VARCHAR(1) NOT NULL;
というように、CREATE TABLE する時の書式(NOT NULL)が使えない。
後で、SET NOT NULL してやらないといけない。
・・・が、ADD COLUMN した後で、そのまますぐに SET NOT NULL するとエラーになる。
hoge=# ALTER TABLE hoge ALTER COLUMN chin SET NOT NULL;
ERROR: column "chin" contains null values
「既に NULL 値がセットされちゃってるから、NOT NULL 出来ねえよ。こんにゃろ!」と PostgreSQL に怒られてるわけだ。まあ、そりゃそうだよな。設定とデータの中身がいきなり不整合ってことになっちゃうからな(^^;
そこで、一旦、
UPDATE hoge SET chin='0', man='0';
という SQL を実行して、追加した列に値(例 '0')をセットする。
これで、
ALTER TABLE hoge ALTER COLUMN chin SET NOT NULL;
ALTER TABLE hoge ALTER COLUMN man SET NOT NULL;
を実行しても、エラーは出ず、ちゃんとテーブルに NOT NULL 項目として追加される。
ああ、面倒くさい(^^;