参照制約では、子テーブルの1 つまたは複数の制約列(外部キー(FK))に含まれる各値が、それに対応する親テーブルの参照列(プライマリキー(PK))に必ず存在する2 つのテーブル間のリレーションシップを定義します。参照制約がテンポラル テーブルに関与する場合には、時間に関するリレーションシップも定義できます。
テンポラル参照制約はTeradata Databaseによって強制されないので、「ソフト」参照整合性と呼ばれます。このような制約の定義には、子列のREFERENCES制約にWITH NO CHECK OPTIONを含めて、参照先の親テーブルの列に固有性を強制しないようにする必要があります。このような制約は強制されていませんが、最適化ルーチンは冗長な結合を排除し、問合わせのパフォーマンスを向上するために、それらの制約を使用します。
次に示すテーブルでは、テンポラル参照制約のさまざまなタイプについて説明しています。valid-time列の現在の時刻は、TEMPORAL_TIMESTAMPまたはTEMPORAL_DATEの値になります。詳細については、タイムスタンプを参照してください。
テンポラル参照制約の形式 | 説明 |
---|---|
CURRENT TRANSACTIONTIME | 子テーブルと親テーブルのオープン行のみが考慮対象になります。 子テーブルのオープン行に含まれる各FK値は、親テーブルのオープン行のPK列のどこかに存在する必要があります。 |
CURRENT VALIDTIME | 子テーブルの現在行と将来行が考慮対象になります。履歴行は無視されます。 子テーブルのFK列の各値が、現在の時刻から始まり、子行のvalid-time期間の将来部分全体の期間を持つ親テーブルのPK列に存在する必要があります。 子行の値が親テーブル内の複数の行に存在する場合、それらの親行のvalid-time期間は、組み合わせしたときに現在の時刻を含み子行のvalid-time期間の将来部分全体まで連続する期間を形成する必要があります。 |
SEQUENCED TRANSACTIONTIME | 子テーブルと親テーブルのオープン行とクローズ行が考慮対象になります。 子テーブルの各FK値は、子行のtransaction-time期間と同じ期間中に親テーブルのPK列に存在する必要があります。 子行の値が親テーブル内に複数存在する場合、それらの親行のtransaction-time期間は、組み合わせしたときに子行のtransaction-time期間全体が収まる連続する期間を形成する必要があります。 |
SEQUENCED VALIDTIME | 子テーブルの履歴行、現在行および将来行が考慮対象になります。 子テーブルの各FK値は、子行のvalid-time期間と同じ期間中に親テーブルのPK列に存在する必要があります。 子行の値が親テーブル内に複数存在する場合、それらの親行のvalid-time期間は、組み合わせしたときに子行のvalid-time期間全体が収まる連続する期間を形成する必要があります。 |
NONSEQUENCED VALIDTIME または NONSEQUENCED TRANSACTIONTIME |
時間次元が無視され、非テンポラルの参照制約と同様に動作します。子テーブルの各FK値が親テーブルに存在する必要があります。
NONSEQUENCED参照制約は、テンポラル子テーブルと非テンポラル親テーブル間、またはテンポラル子テーブルとテンポラル親テーブル(ただし、子の親テーブルは子テーブルと同じ種類のテンポラル列を含まない)間でのみ利用できます。 |
例: テンポラル参照制約
CURRENT VALIDTIME参照制約が、次に示す2つのvalid-timeテーブル間に定義されているとします。
Col1 | Col2 (FK) | VTColA |
---|---|---|
100 | 5 | ('2006/05/20', '2016/05/20') |
ColA | ColB (PK) | VTColB |
---|---|---|
200 | 5 | ('2006/07/20', '9999/12/31') |
どのような制約にも当てはまりますが、子テーブルの制約された参照元(FK)列に含まれるすべての値が、親テーブルの参照先(PK)列に存在する必要があります。ただし、これらのテーブルはテンポラル テーブルであり、制約がCURRENT VALIDTIMEであるため、現在の時刻から始まり将来の時刻まで続く子行のvalid-timeが、それに対応する1つまたは複数の親行のvalid-timeに収まる必要があります。
- 挿入時のTEMPORAL_DATEが2006/11/20の場合には、制約違反にはなりません。
親行のvalid-time期間には、子行のvalid-time期間のうち現在の時刻から始まる部分が収まります。
親行のvalid-timeには、子行の2006/05/20から2006/07/20の部分が含まれていませんが、この部分は履歴であり、CURRENT VALIDTIME関係制約では履歴を無視します。
親テーブルの値が複数の行に存在することがあります。これは、子行の有効時間の現在および将来部分を格納するために、そのような行のすべてのvalid-time期間を組み合わせる場合です。親テーブルに次に示す行が含まれている場合には、CURRENT VALIDTIME関係制約の違反にはなりません。
ColA ColB (PK) VTColB 150 5 ('2006/07/20', '2009/07/20') 250 8 ('2004/07/20', '2005/07/20') 350 5 ('2009/07/20', ‘2017/07/20’) - 挿入時のTEMPORAL_DATEが2006/06/20の場合には、制約違反になります。
対応する親行には、子行の有効時間(2006/06/20から2006/07/20)の現在部分が含まれていません。
CURRENT参照制約とSEQUENCED参照制約は、同じタイプの時間(有効時間、またはトランザクション時間)を保持するテーブル間にのみ定義できます。NONSEQUENCED参照制約は、制約に指定した時間のタイプ(VALIDTIMEまたはTRANSACTIONTIME)を含む子テーブルと、それと一致する時間次元を含まない親テーブルとのテーブル間に定義できます。
次に示す表は、各タイプの親テーブルと子テーブル間に作成できる参照制約の種類の概要です。
子テーブル タイプ | 親テーブル タイプ | |||
---|---|---|---|---|
非テンポラル(USI) | 有効時間 | トランザクション時間 | 二重テンポラル | |
非テンポラル | R | オープン親行についてのTRC | R | TRC |
有効時間 | NVT | CVT SVT |
無効 | CVT SVT |
トランザクション時間 | NTT | NTT TRC | CTT STT |
CTT TRC STT TRC |
二重テンポラル | NTT NVT |
NTT CVT SVT |
CTT STT NVT |
CTT STT CVT SVT |
この表に表わされている参照制約のタイプは、次のとおりです。
R = 通常の非テンポラル参照制約
CVT = Current Valid Time
CTT = Current Transaction Time
SVT = Sequenced Valid Time
STT = Sequenced Transaction Time
NVT = Nonsequenced Valid Time
NTT = Nonsequenced Transaction Time
TRC =Temporal Relationship Constraint (テンポラル関係制約を参照)
テンポラル関係制約をTeradata Databaseが実施することはありませんが、次に示す表では、子FKに対するテンポラル関係制約のタイプと、参照先の親テーブルに対する固有性制約のタイプとの間に存在することが想定されるリレーションシップについて説明しています。
子テーブルの関係制約に対するテンポラル修飾子 | 親テーブルのPK/UNIQUE制約に対して想定されるテンポラル修飾子 |
---|---|
CURRENT TRANSACTIONTIME | CURRENT TRANSACTIONTIME または SEQUENCED TRANSACTIONTIME |
SEQUENCED TRANSACTIONTIME | SEQUENCED TRANSACTIONTIME |
NONSEQUENCED TRANSACTIONTIME | 親テーブルはtransaction-time列を持つことができません |
CURRENT VALIDTIME | CURRENT VALIDTIME または SEQUENCED VALIDTIME |
SEQUENCED VALIDTIME | SEQUENCED VALIDTIME |
NONSEQUENCED VALIDTIME | 親テーブルはvalid-time列を持つことができません |
例: sequenced validtime外部キー
次の例は、SEQUENCED VALIDTIME外部キーを示しています。PrjAsgnmentDuration列は、従業員がプロジェクトに割り当てられる期間を保持します。
CREATE MULTISET TABLE employee ( empid INTEGER, address VARCHAR(200), jobduration PERIOD(DATE) AS VALIDTIME )PRIMARY INDEX ( empid ); CREATE MULTISET TABLE project ( prjid INTEGER, empid INTEGER, PrjAsgnmentDuration PERIOD(DATE) AS VALIDTIME, SEQUENCED VALIDTIME FOREIGN KEY(empid) REFERENCES WITH NO CHECK OPTION employee (empid) )PRIMARY INDEX (prjid );
次の例は、SEQUENCED VALIDTIME AND CURRENT TRANSACTIONTIME外部キーを示しています。
CREATE MULTISET TABLE employee ( empid INTEGER, address VARCHAR(200), jobduration PERIOD(DATE) AS VALIDTIME, tt PERIOD(TIMESTAMP(6) WITH TIME ZONE ) AS TRANSACTIONTIME NOT NULL ) PRIMARY INDEX ( empid ); CREATE MULTISET TABLE project ( prjid INTEGER, empid INTEGER, PrjAsgnmentDuration PERIOD(DATE) AS VALIDTIME, tt PERIOD(TIMESTAMP(6) WITH TIME ZONE ) AS TRANSACTIONTIME NOT NULL, SEQUENCED VALIDTIME AND CURRENT TRANSACTIONTIME FOREIGN KEY(empid) REFERENCES WITH NO CHECK OPTION employee (empid) ) PRIMARY INDEX (prjid );
次の例は、SEQUENCED VALIDTIME AND CURRENT TRANSACTIONTIME外部キーを持つ既存のテンポラル テーブルの変更を示しています。
CREATE MULTISET TABLE employee ( empid INTEGER, address VARCHAR(200), jobduration PERIOD(DATE) AS VALIDTIME, tt PERIOD(TIMESTAMP(6) WITH TIME ZONE ) AS TRANSACTIONTIME NOT NULL ) PRIMARY INDEX ( empid ); CREATE MULTISET TABLE project ( prjid INTEGER, empid INTEGER, PrjAsgnmentDuration PERIOD(DATE) AS VALIDTIME, tt PERIOD(TIMESTAMP(6) WITH TIME ZONE ) AS TRANSACTIONTIME NOT NULL ) PRIMARY INDEX (prjid ); ALTER TABLE project add SEQUENCED VALIDTIME AND CURRENT TRANSACTIONTIME FOREIGN KEY(empid) REFERENCES WITH NO CHECK OPTION employee (empid) ;