チェック制約は外部テーブル データを利用できますか?
リレーショナル データベース管理の領域では、チェック制約はデータの整合性を確保する上で重要な役割を果たします。 。これらの制約により、テーブルに挿入できる値に特定のルールが適用されます。一般的な使用例は、値を特定の範囲内に制限したり、他のテーブルとの一貫性を確保したりすることです。
しかし、チェック制約は、適用されるテーブルのみを参照することを超えることができますか?他のテーブルのデータを利用して制限を定義できますか?
CROSS JOIN チェックの力
答えは、はっきりと「はい」です。クロス結合チェックを使用すると、チェック制約を別のテーブルに関連付けることができます。この手法を使用すると、複数のソースからのデータに基づいてルールを適用する制約を作成できます。
例: テーブル間チェック制約
示されている例を考えてみましょう。
サブの StartDate と EndDate が確実に一致するようにしたいとします。 - プロジェクトの期間が、プロジェクトの期間の対応する値を超えていないこと。次のように、SubProjectTimeSpan にクロス結合チェック制約を作成できます。
ALTER TABLE SubProjectTimeSpan ADD CONSTRAINT CK_TimeSpanRange CHECK ( EXISTS ( SELECT * FROM ProjectTimeSpan WHERE StartDate <= SubProjectTimeSpan.StartDate AND EndDate >= SubProjectTimeSpan.EndDate ) );
このチェックは、制約定義内の ProjectTimeSpan テーブルを効果的にクエリします。 SubProjectTimeSpan の各行について、重複する開始日と終了日を持つ一致する行が ProjectTimeSpan 内に少なくとも 1 つ存在することが保証されます。
関数による代替手段
代わりに、チェック制約内でユーザー定義関数を使用できます。このアプローチにより柔軟性が高まり、他のテーブルのデータを参照する複雑なロジックを組み込むことができます。
たとえば、この例では次の関数を使用できます:
CREATE FUNCTION CheckFunction() RETURNS INT AS BEGIN RETURN ( SELECT CASE WHEN EXISTS ( SELECT * FROM ProjectTimeSpan WHERE StartDate <= SubProjectTimeSpan.StartDate AND EndDate >= SubProjectTimeSpan.EndDate ) THEN 1 ELSE 0 END ); END;
チェック制約を使用して適用できますfunction:
ALTER TABLE SubProjectTimeSpan ADD CONSTRAINT CK_TimeSpanRange CHECK (CheckFunction() = 1);
結論
クロス結合チェック制約とユーザー定義関数を使用すると、複数のテーブルのデータを活用する制約を作成できます。これらの手法を活用すると、データの整合性を強化し、複雑なビジネス ルールを効果的に適用できます。可能性は無限であることを忘れないでください!
以上がCheck Constraints は外部テーブルのデータを参照できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。