web-dev-qa-db-ja.com

データベースの制約とは何ですか?

データベース制約の明確な定義とは何ですか?データベースにとって制約が重要なのはなぜですか?制約の種類は何ですか?

84
bala3569

制約は、データベーススキーマ定義の一部です。

通常、制約はテーブルに関連付けられ、CREATE CONSTRAINTまたはCREATE ASSERTION SQLステートメントで作成されます。

データベース内のデータが準拠しなければならない特定のプロパティを定義します。列、テーブル全体、複数のテーブル、またはスキーマ全体に適用できます。信頼性のあるデータベースシステムにより、制約が常に保持されることが保証されます(いわゆる遅延制約の場合は、トランザクション内を除く)。

一般的な制約の種類は次のとおりです。

  • not null-列の各値はNULLであってはなりません
  • 一意-指定された列の値は、テーブルの各行で一意である必要があります
  • 主キー-指定された列の値は、テーブルの各行で一意であり、NULLではない必要があります。通常、データベース内の各テーブルには主キーが必要です-個々のレコードを識別するために使用されます
  • 外部キー-指定された列の値は、別のテーブルの既存のレコードを参照する必要があります(そのプライマリキーまたは他の一意の制約
  • check-式が指定され、制約を満たすためにtrueに評価される必要があります
110
Ziga Kranjec

制約が必要な理由を理解するには、まずデータの整合性の価値を理解する必要があります。

データ整合性とは、データの有効性を指します。データは有効ですか?あなたのデータは、あなたがそれらを設計したものを表していますか?

私が尋ねる奇妙な質問は何ですか?しかし、残念なことに、データベースにはゴミデータ、他のテーブルの行への無効な参照、長いこと...、そしてビジネスロジックにとって何の意味もない値でいっぱいですもはやあなたのソリューションの。

このゴミはすべて、パフォーマンスを低下させる傾向があるだけでなく、最終的に理解するように設計されていないデータを取得するアプリケーションロジックの時限爆弾でもあります。

制約は、データが破損するのを防ぐために設計時に作成するルールです。データベースソリューションの心の子を長期間生存させるために不可欠です。制約がなければ、ソリューションは時間と使用量が増えると確実に劣化します。

データベース設計の設計は、ソリューションの誕生にすぎないことを認識する必要があります。その後、(願わくば)長く生き、エンドユーザー(クライアントアプリケーションなど)によるあらゆる種類の(奇妙な)動作に耐えなければなりません。しかし、開発におけるこの設計段階は、ソリューションを長期にわたって成功させるために重要です!それを尊重し、必要な時間と注意を払ってください。

賢者はかつて言った:「データはそれ自身を守らなければならない!」。そして、これが制約の役割です。データベース内のデータを可能な限り有効に保つのはルールです。

これを行うには多くの方法がありますが、基本的には次のように要約されます:

  • 外部キー制約はおそらく最も使用される制約であり、参照するターゲット行が実際に存在する場合にのみ他のテーブルへの参照が許可されるようにします。また、これにより、参照行を削除してデッドリンクを作成することにより、このような関係を破ることができなくなります。
  • チェック制約は、特定の列で特定の値のみが許可されることを確認できます。 VARCHAR列で単語「Yellow」または「Blue」のみを許可する制約を作成できます。他のすべての値はエラーになります。チェック制約の使用に関するアイデアを取得するAdventureWorksサンプルデータベースのsys.check_constraintsビューを確認します
  • SQL Serverのルールは、再利用可能なチェック制約です(1つの場所から構文を維持でき、制約を他のデータベースに簡単に展開できます) )

ここでほのめかしたように、データベース設計に最適で最も防御的な制約アプローチを構築するには、いくつかの徹底的な考慮が必要です。最初に、上記のさまざまな制約タイプの可能性と制限を知る必要があります。さらに読むには次を含めることができます。

外部キーの制約-Microsoft

外部キー制約-w3schools

制約の確認

幸運を! ;)

36
Alex

制約はデータのルールに他なりません。有効なデータと無効なデータは、制約を使用して定義できます。そのため、データの整合性を維持できます。広く使用されている制約は次のとおりです。

  1. プライマリキー:データを一意に識別します。この制約が特定の列に指定されている場合、その列に重複データを入力することはできません
  2. チェックNOT NULLなど。ここで、特定の列に入力できるデータと、その列に予期しないデータを指定できます。
  3. 外部キー:他のテーブルの行への外部キー参照。そのため、あるテーブルで別のテーブルから参照されるデータは、参照するテーブルで常に使用できます。
6
user3107247

制約を使用して、データの特定のプロパティを強制できます。簡単な例は、int列を値[0-100000]に制限することです。 これ 紹介は良さそうです。

3
Anders Abel

制約により、データベース内のデータに有効な値が決まります。たとえば、値がnullでないこと(NOT NULL制約)、または別のテーブルに一意の制約として存在すること(FOREIGN KEY制約)、またはこのテーブル内で一意であることを強制できます。 (要件に応じてUNIQUE制約またはPRIMARY KEY制約)。 CHECK 制約を使用して、より一般的な制約を実装できます。

SQL Server 2008の制約に関するMSDNドキュメント は、おそらく最も良い出発点です。

3
Jon Skeet

データベースは、非公式のビジネスルールのセットで構成される、概念(またはビジネス)モデルのコンピューター化された論理表現です。これらのルールは、ユーザーが理解しているデータの意味です。コンピューターは正式な表現のみを理解するため、ビジネスルールをデータベースで直接表現することはできません。これらは、整合性制約のセットで構成される論理モデルである正式な表現にマッピングする必要があります。これらの制約(データベーススキーマ)は、ビジネスルールのデータベース内の論理表現であるため、DBMSが理解しているデータの意味です。したがって、DBMSがビジネスルールを表す制約の完全なセットを認識していない、または強制しない場合、データの意味を完全に理解していないため、(a)破損を防止してその整合性を保証することはできません。 (b)それから推論の整合性(つまり、クエリ結果)—これは、DBMSがせいぜい不完全であると言う別の方法です。

注:DBMSの「理解された」意味-整合性制約は、ユーザーが理解した意味-ビジネスルールと同一ではありませんが、何らかの意味が失われても、データから論理的な推論を機械化できます。

ファビアンパスカルによる「古いクラスのエラー」

2
onedaywhen
  1. UNIQUE制約(そのうちPRIMARY KEY制約はバリアントです)。特定のフィールドのすべての値がテーブル全体で一意であることを確認します。これはX- axis constraint(records)です

  2. CHECK制約(そのうちNOT NULL制約はバリアントです)。特定の条件が同じレコードのフィールドの式に対して成立することを確認します。これはY- axis constraint(fields)です

  3. FOREIGN KEY制約。フィールドの値が別のテーブルのフィールドの値の中にあることを確認します。これはZ- axis制約(テーブル)です。

2
Quassnoi

SQLには、基本的に4種類の主な制約があります。

  • Domain Constraint:新しいタプルに指定された属性値のいずれかが指定された属性ドメインのものでない場合

  • キー制約:新しいタプルのキー属性の値がリレーションの別のタプルにすでに存在する場合

  • 参照整合性:新しいタプルの外部キー値が、参照される関係に存在しない主キー値を参照する場合

  • Entity Integrity:新しいタプルの主キー値がnullの場合

2
Ragu