破壊的SQL
PostgreSQLね
data_queueってテーブルがあって、行の作成日時が
created_at TIMESTAMPTZ
と定義されてる。
実行開始日を指定することになって、start_at TIMESTAMPTZを追加することになった。
で、書かれたSQLがこれ。
ALTER TABLE data_queue ADD COLUMN start_at TIMESTAMPTZ NOT NULL DEFAULT now();
UPDATE data_queue SET start_at = created_at;
ダメだろ
運用中のシステムってこと忘れてるだろ
これだと、現在時刻がデフォルト値としてカラム追加と同時に設定されてしまう
そのうえ、全レコードに対してcreated_atを上書きしてる
すでにstart_atが設定されてたら?ってこと忘れてるわ
作ったばっかりだから、すべてに対して上書きすることに関しては今回はまず問題ないのは事実なんだけど
破壊的作業はやらない方がいい
運用中、無停止でに作業の可能性を考えると
以下の手順でないとダメ
ALTER TABLE data_queue ADD COLUMN start_at TIMESTAMPTZ;
ALTER TABLE data_queue ALTER COLUMN start_at SET DEFAULT now();
UPDATE data_queue SET start_at = created_at WHERE start_at IS NULL;
ALTER TABLE data_queue ALTER COLUMN start_at SET NOT NULL;
1.テーブルにカラムだけ作る
2. デフォルトを設定
3. カラムがNULLのものだけ、createad_atからコピーしてインサート
4. NOT NULLを指定
この手順を守ってる限り、どこからでもやり直せる
非破壊的なクエリになってる