スケーラブルデータベースサーバ HiRDB Version 8 解説(Windows(R)用)

[目次][用語][索引][前へ][次へ]

5.8 参照制約

データベース中の表は,それぞれ独立しているのではなく,お互いに関連を持っている場合があります。一方の表に関連するデータがないと,ほかの表でそのデータの意味がないことがあります。表間のデータの参照整合性を保つため,表定義時に特定の列(外部キーといいます)に定義する制約が参照制約です。参照制約及び外部キーを定義した表を参照表,外部キーによって参照表から参照される表を被参照表といいます。なお,被参照表には外部キーによって参照される主キーを定義しておく必要があります。

なお,SQLやユティリティの実行などで被参照表と参照表間の参照整合性が保証できなくなる場合があります。この場合,参照表は検査保留状態になります。検査保留状態については,「5.10 検査保留状態」を参照してください。

被参照表と参照表の例を次の図に示します。この例では,商品表が参照表,製造元表が被参照表となります。参照表の外部キーから主キーを参照し,製造元名が分かります。

図5-8 被参照表と参照表の例

[図データ]

参照制約については,マニュアル「HiRDB Version 8 システム導入・設計ガイド」を参照してください。

参照制約の効果
参照制約を定義すると,表間のデータの整合性チェック,及びデータ操作を自動化できるのでUAPを作成するときの負荷を軽減できます。ただし,被参照表や参照表を更新する場合,データの整合性をチェックするため,チェックに掛かる処理時間が増加します。
<この節の構成>
(1) 参照制約の定義
(2) データ操作と整合性

(1) 参照制約の定義

参照制約を有効にするためには,外部キーによって参照される主キーを被参照表に定義しておく必要があります。定義系SQLのCREATE TABLEで被参照表にPRIMARY KEY(主キー)を指定します。また,検査保留状態を使用するには,pd_check_pendingオペランドUSEを指定するか,又はオペランドの指定を省略します。

参照表には,FOREIGN KEY(外部キー)を指定し,FOREIGN KEY句中に次の指定をします。

CASCADE,又はRESTRICTを指定した場合の被参照表と参照表の動作について説明します。

(a) CASCADEを指定している場合

CASCADEを指定すると,被参照表の主キーに変更があった場合,外部キーも同じように変更されます。なお,参照表の外部キーに変更がある場合,主キーに変更後の値と同じ値の行があるかどうかをチェックして,参照制約違反エラーになれば外部キーは変更されません。

CASCADEを指定している場合,被参照表及び参照表にSQLを実行するときの動作の例を次の図に示します。

図5-9 被参照表に更新SQLを実行するときの動作の例(CASCADE指定時)

[図データ]

〔説明〕
主キーの値と同じ値の行が外部キーにあれば,制約を保持するために,外部キーも主キーと同じように変更されます。この場合,被参照表への更新は実行されます。挿入及び削除も同じです。

図5-10 参照表に更新SQLを実行するときの動作の例(CASCADE指定時)

[図データ]

〔説明〕
更新後の外部キーの値と同じ値の行が主キーにあれば,外部キーへの更新が実行されます。同じ値の行がなくても,外部キーにナル値があるときは外部キーへの更新が実行されます。ナル値がないときは参照制約違反エラーになります。この場合,被参照表には特に影響はありません。挿入及び削除も同じです。
(b) RESTRICTを指定する場合

RESTRICTを指定すると,被参照表の主キーに変更がある場合,外部キーに同じ値の行があれば,参照制約違反エラーになり,主キーは変更されません。なお,外部キーに変更がある場合,主キーに同じ値の行があるかどうかをチェックして,参照制約違反エラーになれば外部キーは変更されません。

RESTRICTを指定している場合,被参照表にSQLを実行するときの動作を次の図に示します。参照表の動作は,CASCADE指定時(図5-10を参照)と同じです。

図5-11 被参照表に更新SQLを実行するときの動作の例(RESTRICT指定時)

[図データ]

(2) データ操作と整合性

被参照表及び参照表に対する操作系SQL(PURGE TABLE文を除きます)によるデータ操作は,HiRDBがSQL実行時にチェックし,整合性を保証します。ただし,次に示すデータ操作をした場合,整合性を保証できなくなることがあります。

これらの操作をした場合,データの整合性を確認する必要があります。データの整合性確認手順については,マニュアル「HiRDB Version 8 システム導入・設計ガイド」を参照してください。また,pd_check_pendingオペランドにUSEを指定していて,これらの操作をした場合,参照表は検査保留状態になります。