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

参照制約では、子テーブルの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) ;