17.10 - 保全制約レベル - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQLデータ定義言語 詳細トピック

Product
Advanced SQL Engine
Teradata Database
Release Number
17.10
Release Date
2021年7月
Content Type
プログラミング リファレンス
Publication ID
B035-1184-171K-JPN
Language
日本語 (日本)

保全制約は、列の属性またはテーブルの属性のいずれかとして指定できます。

実テーブルの1つの列の要素にのみ適用される制約は、列属性制約と呼ばれます。

次のテーブル定義を考えてみましょう。

CREATE TABLE good_1 (
  column_1 INTEGER NOT NULL CONSTRAINT primary_1 PRIMARY KEY,
  column_2 INTEGER NOT NULL CONSTRAINT unique_1 UNIQUE,
  column_3 INTEGER CONSTRAINT check_1 CHECK (column_3 > 0));

テーブルgood_1は、次の3つの列属性制約を定義します。

  • good_1.column_1上のprimary_1という名前の単一PRIMARY KEY制約。

    この制約では、good_1.column_1に挿入される値は、行を固有に識別するものでなければなりません。制約に違反すると、データベースは行の挿入を拒否します。

    PRIMARY KEY値は更新されないため、通常、更新でこの制約に違反することはありませんが、違反した場合、データベースは更新を拒否します。

  • good_1.column_2上のunique_1という名前の単一UNIQUE制約。

    この制約では、good_1.column_2に挿入される値は、常に固有でなければなりません。制約に違反すると、データベースは行の挿入、または既存の行のgood_1.column_2の更新を拒否します。

  • good_1.column_3上のcheck_1という名前の単一CHECK制約。

    この制約では、good_1.column_3に挿入される値は、常にゼロより大きいかnullである必要があります。制約に違反すると、データベースは行の挿入、または既存の行のgood_1.column_3の更新を拒否します。

実テーブル内の複数の列、または別の実テーブルの1つ以上の列のいずれかに適用される制約は、テーブル属性制約と呼ばれます。

次に、以下のテーブル定義を考えてみましょう。

CREATE TABLE good_2 (
  column_1 INTEGER NOT NULL
  column_2 INTEGER NOT NULL,
  column_3 INTEGER NOT NULL,
  column_4 INTEGER NOT NULL,
  column_5 INTEGER,
  column_6 INTEGER,
 CONSTRAINT primary_1 PRIMARY KEY (column_1, column_2),
 CONSTRAINT unique_1  UNIQUE (column_3, column_4),
 CONSTRAINT check_1   CHECK (column_3 > 0 OR column_4 IS NOT NULL),
 CONSTRAINT ref_1     FOREIGN KEY (column_5, column_6)
                      REFERENCES parent_1 (column_2, column_3));

テーブルgood_2は、次の4つのテーブル レベルの制約を定義します。

  • column_1およびcolumn_2上のprimary_1という名前の複合PRIMARY KEY制約。

    この制約の場合、good_2.column_1およびgood_2.column_2に挿入される値は、行を固有に識別するものでなければなりません。制約に違反すると、データベースは行の挿入を拒否します。

    PRIMARY KEY値は更新されないため、通常、この制約に違反することはありませんが、違反した場合、データベースは更新を拒否します。

  • column_3およびcolumn_4上のunique_1という名前の複合UNIQUE制約。

    この制約の場合、good_2.column_3およびgood_2.column_4に挿入される値は、これらの列の両方で常に固有でなければなりません。制約に違反すると、データベースは行の挿入、または既存の行の列good_2.column_3またはgood_2.column_4の更新を拒否します。

  • column_3およびcolumn_4上の複数列CHECK制約。

    この制約の場合、good_2.column_3に挿入される値がゼロより大きいか、またはgood_2.column_4に挿入される値がnull以外でなければなりません。これらの両方の制約に違反すると、データベースは行の挿入、またはgood_2の既存の行のこれらの列の更新を拒否します。

    この制約はOR条件を使用して定義されるため、good_2.column_3がゼロより大きい場合、またはgood_2.column_4がnullでない場合のいずれかのとき制約が満たされます。

  • good_2.column_5およびgood_2.column_6上の複合FOREIGN KEY制約。parent_1.column_2およびparent_1.column_3を参照し、good_2.column_5parent_1.column_2にマッピングされ、good_2.column_6parent_1.column3にマッピングされます。

    この制約では、good_2.column_5およびgood_2.column_6のそれぞれの値が、parent_1.column_2およびparent_1.column_3の値のどのペアとも一致しない場合に、データベースは、good_2への行の挿入、またはgood_2の既存の行のこれらの列に対する更新を拒否します。

    この制約は、good_2.column_5good_2.column_6parent_1.column_2、およびparent_1.column_3の列のすべてがnullである場合にも有効ですが、参照整合性制約の列にnullを許可することは設計の良い例とは言えません。