主キー・外部キー以外にも、テーブル単位でデータの整合性を強制する仕組み(制約)があります。 特に押さえたいのは UNIQUE と CHECK の 2 つ:
指定カラムに同じ値が 2 件以上入らないことを強制する。
例:users.email が UNIQUE → 同じメールアドレスで 2 アカウント作成不可
破ろうとすると:UNIQUE constraint failed エラー
カラムが満たすべき条件式を強制する。
例:products.price >= 0 → マイナス価格を弾く
破ろうとすると:CHECK constraint failed エラー
制約の存在意義は 「アプリ側のバグがあっても DB が最後の砦になる」こと。 アプリ側のバリデーション漏れで不正データが流れてきても、DB が拒否してくれます。
📌 QA 視点:制約違反のエラーメッセージは「DB 側でデータが弾かれた」サイン。 500 エラーで UNIQUE constraint failed のような文字列が出ていたら、フロント/API 側のバリデーション漏れを疑います。
users.email カラムに UNIQUE 制約がある状態で、すでに登録済みのメールアドレスで新規ユーザーを作ろうとすると何が起きる?