ほとんどの場合は、Teradata PT API、Teradata JDBC、およびTerada DSAを使用して、参照整合性を持つテーブルをソースからターゲットにコピーできます。
テーブルの任意の外部キー(FK)列が別のテーブルのプライマリ キー(PK)列を参照する場合、このテーブルは参照整合性を持ちます。参照整合性は、PK列とFK列の間でデータの整合性および一貫性を保つのに役立ちます。
CREATE TABLE文またはALTER TABLE文を使用すると、テーブルに参照整合性の制約を追加できます。Teradata Databaseでは、標準、バッチ、およびソフトの参照整合性を宣言できます。次の異なる種類の参照整合性の例では、複合外部キーの列セット (Name, Deptid) が、親テーブルdb.employee_PKのプライマリ キー列(Name, Deptid)を参照しています。
参照整合性 | 例 | 説明 |
---|---|---|
標準 | FOREIGN KEY ( Name , Deptid ) REFERENCES db.employee_PK ( Name , Deptid )) |
行レベルの参照整合性が保たれます。 |
バッチ | FOREIGN KEY ( Name , Deptid ) REFERENCES WITH CHECK OPTION db.employee_PK ( Name , Deptid )) |
暗黙のトランザクション全体に対して参照整合性が保たれます。単一文がテーブルに複数の行を挿入する場合に役立ちます。 |
ソフト | FOREIGN KEY ( Name , Deptid ) REFERENCES WITH NO CHECK OPTION db.employee_PK ( Name , Deptid )) |
PKとFKの関係に参照整合性を保つことで、Teradata Databaseがシステムのオーバーヘッドを発生させないように明示的に指示します。 |
次のシナリオで、Data Moverが外部キーを持つテーブルのコピーを処理する方法について説明します。
ソース テーブル | ターゲット テーブル | Data Moverの結果 |
---|---|---|
FK定義が存在する | テーブルが存在しない。 | ソース テーブルが、ソースのFK定義と共にターゲットにコピーされます。 |
FK定義が存在する | FK定義がありません。 | ソース テーブルが、参照整合性を伴わずにターゲットにコピーされます。そのためターゲット テーブルはFK定義を持ちません。 |
col1およびcol2にFK定義あり | col3およびcol4にFK定義があります。 | ソース テーブルがターゲットにコピーされますが、ターゲット テーブルの元のFK定義(col3およびcol4のFK)が維持されます。ターゲット テーブルでは、ソース テーブルのFK定義 (col1およびcol2のFK) は使用されません。 |
次の制限が、参照整合性を持つテーブルのコピーに適用されます。
- 親テーブルをターゲットにコピーする場合、次の2つの条件のいずれかに当てはまる場合、子テーブルがジョブの一環としてコピーされないターゲット上に、親テーブルは存在できません。
状態 例 エラー情報 子テーブルに親テーブルに対する ハード参照整合性がある。 ソース テーブルAおよびBがあり、AはBおよびCの親である。 Cはターゲット上にAに対するハード参照がある一方でCはコピーされない場合に、ソース テーブルAおよびBをコピーすると、エラーが発生します。BはAをソフト参照整合性で参照しているため、AおよびCのみを移動する場合にジョブを作成する必要があります。 ターゲット テーブルA、B、およびCがあり、AはBならびにCの親です。BはAをソフト参照整合性で参照していて、CはAをハード参照整合性で参照しています。 - 子テーブルをコピーするときに、親テーブルを名前変更または再配置できるのは、子テーブルがすでにターゲット データベースに存在する場合、または親テーブルの存在するデータベースがターゲットとソースで同じである場合のみです。
- ターゲットにテーブルが存在しない場合は、ソース テーブルの定義がターゲット テーブルを作成するために使用されます。Teradata Databaseは、テーブル定義においてプライマリ キーを固有インデックスとして表わすため、PKの代わりに固有インデックスを使用してターゲット テーブルが作成されます。子テーブルは、固有プライマリ インデックスまたは固有セカンダリ インデックスを持つテーブルを参照できます。
- ジョブがTeradata DSAを使用してデータベース全体をコピーするときに、このデータベースに外部キーを持つテーブルがある場合、ターゲット テーブルは外部キーなしで作成されます。
- ソース テーブルおよびターゲット テーブルが異なるFKを持つ場合は、テーブルのコピー後、ターゲット テーブルのFKが維持されます。
- 親テーブルをコピーせずに子テーブルをコピーできるのは、子テーブルがすでにターゲット データベースに存在する場合、または親テーブルの存在するデータベースがターゲットとソースで同じである場合のみです。
- テーブルを移動するときに、親テーブルにIDキーGENERATE ALWAYSがあり、そのキーが子テーブルの外部キーとして使用されている場合、それらのテーブルはTeradata DSAでのみ移動することができます。DSA、TPT、またはJDBCでは、このタイプのRIテーブルの部分コピーはサポートされません。
親テーブル(PT1)のプライマリ キーが子テーブル(CT1)の外部キーを参照するのと同時に、CT1のプライマリ キーがPT1の外部キーを参照する場合、この2つのテーブルは循環参照を持つと言います。つまり、両方のテーブル間にPKとFKの相互関係が存在します。循環参照を持つソーステーブルをコピーする場合、ターゲット テーブルにPKとFKの相互関係がなければ、Data Moverはターゲットにのみコピーできます。ターゲット テーブル間に循環参照があってはなりません。Data Moverが循環参照を持つソース テーブルをコピーしようとしたときに、ターゲット上にテーブルがない場合は、エラーが発生します。