16.20 - プライマリキーおよび固有性制約 - Teradata Vantage NewSQL Engine

Teradata Vantage™ テンポラル テーブル サポート

prodname
Teradata Database
Teradata Vantage NewSQL Engine
vrm_release
16.20
category
プログラミング リファレンス
featnum
B035-1182-162K-JPN
プライマリ キー制約と固有性制約は、テーブルの行の間での列値の固有性を強制します。
  • CURRENT VALIDTIME PRIMARY KEY制約とCURRENT VALIDTIME UNIQUE制約は、現在の時刻から将来までのどの時点でも、行内の制約列の値が固有であることを保証します。valid-time期間が重なっている現在行と将来行は、制約列に同じ値を保持することができません。
  • SEQUENCED VALIDTIME PRIMARY KEY制約とSEQUENCED VALIDTIME UNIQUE制約は、履歴行、現在行、および将来行を含めて、どの時点でも行内の制約列の値が固有であることを保証します。valid-time期間が重なっているすべての行は、制約列に同じ値を保持することができません。
  • NONSEQUENCED VALIDTIME PRIMARY KEY制約とNONSEQUENCED VALIDTIME UNIQUE制約は、valid-time列を非テンポラルと同様に扱います。これらの制約は、行内の制約列の値がテーブルに含まれるすべての行の間で固有であることを保証します。すべてのオープン行は、制約列に同じ値を保持することはできません。
    NonsequencedのPK制約および固有性制約は、非テンポラル テーブルに対するPK制約および固有性制約と同じになります。これらのタイプの制約は、テンポラル テーブルに対して実用になることは希であり、推奨されていません。テンポラル テーブルで行が変更されるときに自動的に発生する類似行の重複によって、nonsequencedのPK制約および固有性制約はすぐに違反されることになります。同様の状況は、テンポラル テーブルに適用するUSIでも発生します。これも、推奨されていません。

例: プライマリ キーおよび固有性制約

TEMPORAL_DATEが、2006年11月2日(2006/11/02)であり、valid-time テーブルがCol1列、Col2列、およびVTCol列で定義されているとします(VTColは、valid-time列)。さらに、CURRENT VALIDTIME UNIQUE制約がCol2に定義されているとします。次に示す行について考えてみます。

Col1 Col2 (固有) VTCol
5 24 ('2006/10/20', '2007/10/20')

この行は、次に示す行に対する制約違反にはなりません。

6 24 ('2008/01/20', '9999/12/31')

これは、valid-time期間が重なっていないためです。同じ最初の行が、次に示す行に対してはCURRENT UNIQUE制約違反になります。

7 24 ('2007/09/20', '9999/12/31')

これは、2007/09/20 から2007/10/20までの期間が重なっているためです。

このテーブルに4番目の列としてtransaction-timeも保持されているとして、次の行について考えてみます。

Col1 Col2 VTCol TTCol
8 24 ('2008/01/20', '9999/12/31') ('2006/09/20', '2006/09/25')

この行はCURRENT制約違反にはなりません。この行は、トランザクション時間でクローズ行になる(UNTIL_CLOSEDより前の終了日付を保持する)ため、制約のチェックで無視されます。

プライマリキー制約と固有性制約のインデックス

テンポラル テーブルに対する変更の結果として行が複製されるため、テンポラル テーブルに定義される大部分のプライマリキー制約と固有性制約は、システム定義の結合インデックス(SJI)によって実装されます。このようなインデックスは、制約がCURRENT制約であるか、SEQUENCED制約であるか、またはNONSEQUENCED制約であるかに応じて、該当の行のサブセットに対して固有性を強制します。

例: システム定義結合インデックス

二重テンポラル テーブルに対するCURRENT固有性制約では、テンポラル テーブルから選択された列を基にSJIが自動的に作成され保守されるようになります。SJIのプライマリ インデックスは、テンポラル テーブルの1つまたは複数の制約列になります。valid-time列とtransaction-time列は、適切に修飾されたWHERE句を使用して選択されます。このWHERE句によって、インデックス内の行が現在行と将来行に制限されます。

CREATE JOIN INDEX  tablename_TJI number 
AS SELECT ROWID,  ConstrainedColumn,  VTColumn,  TTcolumnFROM  tablenameWHERE END(VTColumn  ≥ CURRENT_DATE - INTERVAL '2' DAY
AND   END(TTcolumn) IS UNTIL_CLOSED
PRIMARY INDEX (ConstrainedColumn);

INTERVAL ‘2’ DAYが必要になる理由は、現在行が挿入されるタイムゾーンの日付が、インデックスを作成したタイムゾーンの日付よりも最大2日前になることがあるためです。

SJIは制約テンポラル テーブルと同じデータベース内に作成されます。SJIの名前は、tablename_TJI number命名規則を使用してシステムが自動的に付与します。この命名規則のtablenameは、PK制約または固有性制約が定義されているテンポラル テーブルの名前の最初の121文字になり、numberは、制約のインデックスID (SJIを識別する固有番号)になります。このためテンポラル テーブルは、名前の最初の121文字にテーブルごとの固有性があるように命名する必要があります。

SJIは制約テンポラル テーブルと同じマップをデータ分散に使用します。テンポラル テーブルがスパース マップを使用している場合、SJIは制約されたテーブルと同じコロケーション名も共有します。連続マップおよびスパース マップの詳細については、<Teradata Vantage™ SQLデータ定義言語-構文規則および例、B035-1144>と<Teradata Vantage™ - データベースの設計、B035-1094>を参照してください。

SJIは、システムによって必要に応じて作成、保守、および削除されます。これを直接変更したり削除してはいけません。

PK制約または固有性制約は、それに関連付けられたSJIによってテーブルの副次インデックスの最大許容数を超過することになる場合には利用できません。

時間が経過すると、CURRENT_DATEおよびCURRENT_TIMESTAMPの値は、SJIを作成したときに使用した値と異なるものになります。そのため、SJIの現在行と将来行は、やがて履歴行になり、CURRENT制約を実施するためのインデックスには必要ないものになります。

定期的にALTER TABLE TO CURRENT文を使用して、テンポラル テーブルに作成したSJIとPPIを更新してください。ALTER TABLE TO CURRENTによって、currentのプライマリキー制約と固有性制約のために作成したSJIから履歴行が移動されます。ALTER TABLE TO CURRENTについて、詳細はTeradata Vantage™ SQLデータ定義言語-構文規則および例、B035-1144を参照してください。

NONSEQUENCED制約はテンポラル列を非テンポラルと同様に扱うため、valid-timeテーブルに対するnonsequencedのvalid-time PK制約または固有性制約は、制約列にUSIを作成することで自動的に実装されます。二重テンポラル テーブルの場合、PK制約または固有性制約は、SJIが使用されるため、トランザクション時間でオープン行である行に制限する必要があります。SJIではWHERE句を使用して、transaction-time列からオープン行のみを選択します。

結合インデックスでは識別列が利用できないため、PK制約および固有性制約をテンポラル テーブルの識別列に定義することはできません。