ANSI Valid-Timeテーブルのテンポラル参照制約 - Advanced SQL Engine - Teradata Database

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

Product
Advanced SQL Engine
Teradata Database
Release Number
17.10
Published
2021年7月
Language
日本語
Last Update
2021-09-23
dita:mapPath
ja-JP/kit1592007446534.ditamap
dita:ditavalPath
ja-JP/wrg1590696035526.ditaval
dita:id
B035-1186
Product Category
Software
Teradata Vantage

テンポラル参照制約では2つの表間のリレーションシップを定義します。このリレーションシップでは、外部キー(FK)に属するvalid-time列が含まれていて、子表の1つまたは複数の制約列(FK)に含まれる各値が、親表のそれに対応する参照列(プライマリキー(PK))に存在する必要があります。したがって、子表の各行のvalid-time値は、親表内にvalid-time値として存在している必要があります。

このような制約はVantageによって強制されないので、「ソフト参照整合性」と呼ばれることがあります。このような制約は強制されていませんが、最適化ルーチンは冗長な結合を排除し、問合わせのパフォーマンスを向上するために、それらの制約を使用します。
このような制約に違反しないことを確認するのは、ユーザーの責任になります。

テンポラル参照制約は、特殊なPERIODキーワードを使用してvalid-time派生期間列の名前を指定することにより、テンポラル表のvalid-time派生列に対して定義することができます。

ANSI準拠

この文は、ANSI SQL:2011規格に対するTeradata拡張機能です。

構文

FOREIGN KEY ( fk_column_list, PERIOD fk_valid_time_period )
  REFERENCES WITH NO CHECK OPTION
  table_name ( pk_column_list, PERIOD pk_valid_time_period )
fk_column_list
子テーブルの外部キーとして使用される列の名前または列のカンマ区切りのリスト。これらの列は、pk_column_listを参照し、これに対応します。fk_column_list列の各値は、pk_column_listの対応する列に存在する必要があります。
fk_valid_time_period
子テーブルのvalid-time派生期間列の名前。
REFERENCES WITH NO CHECK OPTION
この関係が参照制約であり、データベースによって強制されないように指定します。

WITH NO CHECK OPTIONは、ANSIに対するTeradata拡張機能です。

table_name
外部キーによって参照されるテーブルの名前。
pk_column_list
親テーブルのプライマリキーとして使用される列の名前または列のカンマ区切りのリスト。
pk_valid_time_period
親テーブルのvalid-time派生期間列の名前。

使用上の注意

これはvalid-time列間のリレーションシップであるため、PK-FKテンポラル参照制約リレーションシップ内の参照元のテーブルと参照先のテーブルにはvalid-timeテーブルまたは二重テンポラル テーブルのいずれかを使用できます。テーブルのタイプが一致する必要はありません。二重テンポラル テーブルの詳細については、ANSI二重テンポラル テーブルの作業を参照してください。

例: ANSI Valid-Timeテーブルのテンポラル参照制約

CREATE MULTISET TABLE hire_contracts(
 h_eid INTEGER NOT NULL, 
 h_name VARCHAR(5) NOT NULL,
 h_terms VARCHAR(5),
 contract_start DATE NOT NULL,
 contract_end DATE NOT NULL,
 PERIOD FOR hire_period(contract_start,contract_end) AS VALIDTIME,
 PRIMARY KEY(h_eid, hire_period WITHOUT OVERLAPS)
 )
 PRIMARY INDEX(h_eid);

CREATE MULTISET TABLE employee_vt_ri (
 eid INTEGER NOT NULL,
 ename VARCHAR(5) NOT NULL,
 terms VARCHAR(5),
 job_start DATE NOT NULL,
 job_end DATE NOT NULL,
 PERIOD FOR job_dur(job_start,job_end) AS VALIDTIME,
 UNIQUE(eid,job_dur WITHOUT OVERLAPS),
 FOREIGN KEY(eid,PERIOD job_dur) REFERENCES WITH NO CHECK OPTION
 hire_contracts(h_eid, PERIOD hire_period)
 )
 PRIMARY INDEX (eid);