データの整合性は、あらゆるデータベースシステムの重要な側面であり、保存されたデータが正確であり、一貫性があり、意味のあるものであることを保証します。PostgreSQLでは、データの整合性を維持するための強力なツールの1つがチェック制約の使用です。これらの制約を使用すると、データが従う必要があるルールを定義して、無効なデータの挿入や変更を防ぐことができます。この記事では、無料の DVDレンタルデータベース を参考に、チェック制約を使用してPostgreSQLでデータを検証する方法を説明します。
チェック制約の理解
チェック制約は、テーブルの列または列セットに入力できる値を制限するルールです。これらのルールはデータベースシステムによって強制され、指定された条件に違反する行の挿入や変更を防ぎます。チェック制約は、CHECK
キーワードに続いてBoolean値に評価される式を使用して定義されます。
レンタル期間の検証
“rental_duration“列を含む”dvdrental“データベースの”rental“テーブルの修正バージョンを使用するシナリオを考えてみましょう。テーブル定義は、Navicat のテーブルデザイナーで次のように表示されます。
ここで、レンタル期間が常に0日以上であることを確認したいとします。これは、次のように“rentals_with_rental_period”テーブルにチェック制約を追加することで実現できます。
ALTER TABLE rentals_with_rental_period
ADD CONSTRAINT rental_duration_check
CHECK (rental_duration > 0);
Navicatでは、テーブルデザイナーの“チェック”タブでチェック制約を追加できます。式とオプションの名前を入力するだけです。名前を入力しない場合は、Navicatが一意の名前を作成します。
“保存”ボタンをクリックすると、Navicatはチェック制約を作成するか、制約に違反する行がある場合はエラーメッセージを表示します。
この制約を設定すると、レンタル期間が0以下の"rentals_with_rental_period"テーブルに行を挿入または更新しようとするとエラーになり、有効なレンタル期間のみが許可されるようになります。
有効な評価の適用
"dvdrental"データベースの"film"テーブルからの別の例は、映画の評価の検証です。評価を'G'、'PG'、'PG-13'、'R'、または 'NC-17'などの特定の値のみに制限するとします。これは、チェック制約を使用して実現できます:
ALTER TABLE film
ADD CONSTRAINT film_rating_check
CHECK (rating IN ('G', 'PG', 'PG-13', 'R', 'NC-17'));
Navicatのテーブルデザイナーの同じ制約は次のとおりです:
これで、指定された値に含まれない評価を持つ行を“film”テーブルに挿入または更新しようとすると拒否され、有効な評価のみが許可されるようになります。
NULL値の処理
制約に NULL
をチェックする条件が明示的に含まれていない限り、チェック制約は1つ以上の列に NULL
値を含む行には適用されないことに注意してください。例えば、“film”テーブルの“rental_rate”列が常に0より大きくNULL
ではないことを強制するためには、次の制約を使用します:
ALTER TABLE film
ADD CONSTRAINT film_rental_rate_check
CHECK (rental_rate > 0 AND rental_rate IS NOT NULL);
Navicatのテーブルデザイナーの同じ制約は次のとおりです:
まとめ
チェック制約は、PostgreSQLでデータの整合性を確保するための強力なツールです。データが従うべきルールを定義することで、無効なデータの挿入や変更を防ぎ、データベースの正確性と一貫性を維持するのに役立ちます。データベース設計にチェック制約を組み込むことで、組織のニーズを満たす堅牢で信頼性の高いデータシステムを構築できます。