CHECK制約 (CHECK constraint)
すべての行が満たすべき条件式を宣言するSQLの機能。CHECK (age >= 0)のように書く。検証をアプリではなくDB側で行うので、別のクライアントが書き込んでも不変条件が守られる。
ドメイン上の規則に向いている。たとえばstatusを'active'、'pending'、'closed'のいずれかに限る、emailに'@'を含める、開始日を終了日より前にする、といったものだ。PostgreSQLは完全に対応している。MySQLは長らく構文だけ受け付けて強制しなかったが、8.0.16(2019年)で修正された。複雑な検証はドメイン型と組み合わせることが多い。単純な条件ならINSERT/UPDATEのコストはほぼゼロだが、SELECTを含むサブクエリ付きのCHECKはSQL標準に存在しない。行をまたぐ検証には、似た発想のPostgreSQLの排他制約が使える。