LoginSignup
3
0

More than 1 year has passed since last update.

Postgreのカラムデフォルト値設定ではまった件

Posted at

PostgreSQLのカラムデフォルト設定ではまったので参考情報として共有します。
(ご存じの方には当たり前の内容かもしれませんが・・・)

カラムのデフォルト値設定自体は、以下のALTER文を流すだけなので簡単です。

ALTER TABLE [テーブル名] ALTER COLUMN [カラム名] SET DEFAULT [デフォルト値];

Ver10までは、対象のテーブルに対してUPDATE文が自動で流れる仕様でした。
レコード数が少なければ問題ないのですが、
100万行とかあるようなテーブルに対して流すと
結果がなかなか返ってこなくなります。

そのため、稼働中のサービスでカラム追加してリリースする場合は
他トランザクションからのデッドロック防止のために
サービス停止して作業するという場面もよくありました。

Ver11からは、この仕様が以下のように改善されました。

・ALTER時にはデフォルト値のUPDATEは行なわない
・SELECT時などに値が入っていないレコードに関しては、
 デフォルト値を勝手に返してくれて実際にレコードに値が入ってるかのように見せてくれる

業務で大量レコードのテーブルを扱う人にとっては、超絶ありがたい改善ですよね!

もちろん、私も意気揚々とALTER文を流しました。
100万行以上のテーブルでわずか1秒、はやっ!みたいな(笑)

・・・と、ここまではよかったのですが、問題はこの先です。

SELECT文でデフォルト値をよしなに扱ってくれる仕様なのだったら、
WHERE句の条件でもよしなに扱ってくれるに違いないという思い込みがありました・・・

蓋を開けてみると、まったく見当違いで、
デフォルト値が入っていない場合はNULL扱いになります(><);
例えば、

SELECT * FROM [テーブル] WHERE [カラム] <> 0

みたいなSQL文を書いた場合、カラムにデフォルト値が入ってない場合は
返却されなくなるという罠がありました。

結論

WHERE句の条件文に使用するカラムは明示的にデフォルト値を設定する

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0