SQLのCHECK制約における主要DBの実装差異¶
CHECK制約は各データベース製品によってサポート状況や制限事項が異なる。
MySQL¶
長らく構文はあっても無視されていたが、バージョン8.0.16(あるいは8.0.15)以降で全ストレージエンジンにおいて正式にサポートされるようになった。
SQL Server¶
制約内でサブクエリや他のテーブルを参照することができない。単純な条件式に限定されるため、複雑なロジックが必要な場合はトリガーやビューの利用が検討される。
Oracle¶
カラム定義に続けて記述する際、CONSTRAINT句を省略できるなど、構文を簡略化して記述することが可能。
PostgreSQL¶
条件式がNULL(UNKNOWN)と評価された場合も制約をパスする仕様(→ SQLのCHECK制約とNULL値の扱い)。また、制約内でCASE式を使用できるため、複数のカラムが絡む複雑な条件も記述できる。
-- PostgreSQL: CASE式を使った複雑な条件例
ALTER TABLE orders ADD CONSTRAINT ck_discount_valid CHECK (
CASE
WHEN status = 'promo' THEN discount BETWEEN 0 AND 50
ELSE discount = 0
END
);
BigQuery¶
標準のCHECK制約自体がサポートされていない。詳細はBigQueryにおけるデータバリデーション手法を参照。
関連¶
引用元: NotebookLM