13.2.1 整合性チェック機能

整合性チェック機能は,参照制約又は検査制約の整合性をチェックし,制約に違反する行がない場合は検査保留状態を解除する機能です。

参照制約の整合性チェック
参照制約に基づいて,表の外部キーの値が,その表が参照する表の主キーと同じ値を持つかどうかをチェックします。チェックの結果,制約に違反する行がない場合は,検査保留状態を解除します。制約に違反する行がある場合は,検査保留状態を設定します。ただし,外部キー値にナル値を含む行はチェック対象としません。なお,参照制約の整合性チェックは,データベースの容量によっては時間が掛かることがあります。実行時間については,「(2)(a)参照制約の整合性チェック方法」のSQLから見積もってください。
検査制約の整合性チェック
検査制約の定義に基づいて,行の値が検査制約の範囲内であるかどうかをチェックします。チェックの結果,制約に違反する行がない場合は,検査保留状態を解除します。制約に違反する行がある場合は,検査保留状態を設定します。なお,検査制約の整合性チェックは,データベースの容量によっては時間が掛かることがあります。実行時間については,「(3)(a)検査制約の整合性チェック方法」のSQLから見積もってください。
<この項の構成>
(1) 整合性チェック機能の実行単位
(2) 参照制約の整合性チェック
(3) 検査制約の整合性チェック
(4) 整合性チェック結果による検査保留状態の遷移
(5) 整合性チェックの順番と実行有無

(1) 整合性チェック機能の実行単位

整合性チェック機能は,次のどちらかの単位で実行します。

(a) 表単位

表に定義された参照制約及び検査制約のうち,検査保留状態となったすべての制約に対して,制約ごとに整合性チェックをします。表単位で整合性チェックをする場合は,-tオプションを指定します。

表単位の整合性チェックは,次の場合に適用します。

(b) 制約単位

検査保留状態に関係なく,一つの制約だけの整合性を検査します。制約単位で整合性を検査する場合は,-cオプションを指定します。

制約単位の整合性チェックは,次の場合に適用します。

(2) 参照制約の整合性チェック

(a) 参照制約の整合性チェック方法

参照制約の整合性チェックでは,制約ごとに次のSQLで整合性をチェックします。

このSQLでは作業表を作成する場合があるため,シングルサーバ又はバックエンドサーバに,作業表を格納する作業表用ファイルが必要となります。作業表用ファイルの容量見積もりについては,マニュアル「HiRDB Version 8 システム導入・設計ガイド」を参照してください。
(b) 整合性有無の判断

(a)のSQLの実行結果(SQLCODE)と整合性の有無の関係を,次の表に示します。

表13-5 SQLの実行結果と整合性の有無の関係(参照制約)

SQLCODE(検索行数)整合性の有無
100(0件)整合性あり
0(1件以上)整合性なし
上記以外実行エラー
(c) 制約違反となったキー値の出力

(a)のSQLを実行した結果,制約違反となったキー値を処理結果ファイルに出力します。なお,制約違反となったキー値は重複排除して出力します。

(d) 制約違反キー値の出力数上限値による整合性チェックの中断

制約違反となった行データ数が制約違反キー値の出力数上限値を超えた場合,該当する制約の整合性チェックを終了します。制約違反キー値の出力数上限値は,-wオプションで変更できます。

(3) 検査制約の整合性チェック

(a) 検査制約の整合性チェック方法

検査制約の整合性チェックでは,制約ごとに次のSQLで整合性をチェックします。

このSQLでは作業表を作成する場合があるため,シングルサーバ又はバックエンドサーバに,作業表を格納する作業表用ファイルが必要となります。作業表用ファイルの容量見積もりについては,マニュアル「HiRDB Version 8 システム導入・設計ガイド」を参照してください。
注※
探索条件に指定した列定義がBLOB型又はBINARY型の場合,「DISTINCT」は指定しません。また,この場合は作業表を作成しません。
(b) 整合性有無の判断

(a)のSQLの実行結果(SQLCODE)と整合性の有無の関係を,次の表に示します。

表13-6 SQLの実行結果と整合性の有無の関係(検査制約)

SQLCODE(検索行数)整合性の有無
100(0件)整合性あり
0(1件以上)整合性なし
上記以外実行エラー
(c) 制約違反となったキー値の出力

(a)のSQLを実行した結果,制約違反となったキー値を処理結果ファイルに出力します。なお,探索条件に指定した列のデータ型がBLOB型又はBINARY型を含まない場合,制約違反となったキー値は重複排除して出力します。BLOB型又はBINARY型を含む場合は,制約違反となったキー値の重複排除をしません。

(d) 制約違反キー値の出力数上限値による整合性チェックの中断

制約違反となった行データ数が制約違反キー値の出力数上限値を超えた場合,該当する制約の整合性チェックを終了します。制約違反キー値の出力数上限値は,-wオプションで変更できます。

(4) 整合性チェック結果による検査保留状態の遷移

pdconstckは,制約ごとに整合性チェックをした結果に基づいて,整合性の有無で表の検査保留状態,制約の検査保留状態,又はRDエリアの検査保留状態を,検査保留状態又は非検査保留状態に設定します。RDエリアの検査保留状態の遷移は,pdconstckの実行単位によって異なります。

次に,制約の検査保留状態の遷移,表の検査保留状態の遷移,及びRDエリアの検査保留状態の遷移について説明します。なお,検査制約と参照制約はそれぞれ別に,表の検査保留状態,制約の検査保留状態,又はRDエリアの検査保留状態を遷移します。

制約の検査保留状態の遷移
制約の検査保留状態は,制約ごとの整合性チェックの結果によって,制約ごとに遷移します。
制約の検査保留状態の遷移を次の表に示します。

表13-7 制約の検査保留状態の遷移

制約の整合性チェック結果制約の検査保留状態(設定する値)
整合性あり非検査保留状態(NULL値)
整合性なし検査保留状態('C')
表の検査保留状態の遷移
表の検査保留状態は各制約の検査保留状態によって遷移します。表の検査保留状態の遷移を次の表に示します。

表13-8 表の検査保留状態の遷移

制約の検査保留状態表の検査保留状態(設定する値)
すべての制約が非検査保留状態非検査保留状態(NULL値)
検査保留状態と非検査保留状態の制約が混在検査保留状態('C')
RDエリアの検査保留状態の遷移
RDエリアの検査保留状態は,各制約で行った整合性チェックの結果によって遷移します。RDエリアの検査保留状態の遷移を次の表に示します。

表13-9 RDエリアの検査保留状態の遷移

整合性チェックの結果RDエリアの検査保留状態(設定する値)
すべての制約が整合性あり非検査保留状態(NULL値)
整合性がない制約と,整合性がある制約が混在検査保留状態('C')
(a) 表単位で実行した場合の検査保留状態の遷移

表単位実行時は,制約ごとに整合性チェックをした結果によって,表の検査保留状態,制約の検査保留状態,及びRDエリアの検査保留状態を遷移します。

参照制約が定義された表に対して,表単位に整合性チェックを実行する例を図13-1に示します。また,この例の検査保留状態の遷移を表13-10に示します。

図13-1 表単位での整合性チェック実行例

[図データ]

(凡例)
T1,T2:主キーが定義された表
T3:外部キー(REF1,REF2)が定義された表
CHK1,CHK2:参照制約
USR1~USR4:表を格納しているユーザ用RDエリア
REF1,REF2:ほかの表を参照する外部キー

表13-10 表単位での検査保留状態の遷移(実行例)

整合性チェックの結果検査保留状態
REF1の整合性REF2の整合性表の検査保留状態制約の検査保留状態表格納用RDエリアの検査保留状態
REF1REF2USR1USR2
ありありNNNNN
なしPNPPP
なしありPPNPP
なしPPPPP
(凡例)
P:検査保留状態
N:非検査保留状態

(b) 制約単位での検査保留状態の遷移

制約単位実行時は,指定した制約の整合性チェックをした結果によって,表の検査保留状態,指定した制約の検査保留状態,及びRDエリアの検査保留状態を遷移します。検査保留状態の遷移を次に説明します。

検査保留状態の遷移

指定した制約の整合性結果によって,制約の検査保留状態を遷移します。

図13-1の実行例について,制約CHK1に対して制約単位に整合性チェックをした場合の検査保留状態の遷移を次の表に示します。

表13-11 制約単位での検査保留状態の遷移(実行例)

整合性チェックの結果制約の検査保留状態検査保留状態
CHK1の整合性CHK2表の検査保留状態制約の検査保留状態RDエリアの検査保留状態
CHK1CHK2U1U2
あり非検査保留状態NNNN
あり検査保留状態PNPP
なし非検査保留状態PPPP
なし検査保留状態PPPP
(凡例)
P:検査保留状態
N:非検査保留状態
-:状態を変更しません

(5) 整合性チェックの順番実行有無

(a) 表単位
整合性チェックの順番
表単位で整合性チェックをする場合,整合性チェックの順番は次のようになります。
参照制約と検査制約の順番
-tオプションで指定した表に参照制約及び検査制約の両方が定義されている場合,参照制約(外部キー),検査制約の順で整合性をチェックします。
同一制約内の順番
-tオプションで指定した表に同一制約が複数定義されている場合は,同一制約内の制約名称順に整合性をチェックします。
表単位の整合性チェックでの順番の例を次の表に示します。

表13-12 表単位の整合性チェックでの順番の例

表の制約整合性チェックの順番
参照制約(外部キー)検査制約参照制約(外部キー)検査制約
F1F2C1C2
ありあり1.2.3.4.
なし1.2.
なしあり1.2.
なし
(凡例)
F1,F2:参照制約(外部キー)の制約名
C1,C2:検査制約の制約名
1.~4.:整合性チェックの検査順番
-:該当しません

整合性チェックの実行有無
表単位の整合性チェックは,検査保留状態となった制約だけ整合性を検査します。整合性をチェックする条件と整合性チェック実行有無を次の表に示します。

表13-13 整合性をチェックする条件と整合性チェック実行有無

検査保留状態整合性チェック実行有無備考
表の検査保留状態制約の検査保留状態表格納用RDエリアの検査保留状態1
検査保留状態('C')検査保留状態('C')検査保留状態ありpdconstckは正常状態と判断します(検査保留状態)。
非検査保留状態ありRDエリアが非検査保留状態であるが,ディクショナリ表が検査保留状態のため,整合性をチェックします。
非検査保留状態(NULL値)2検査保留状態なしpdconstckは正常状態と判断します(他制約が検査保留状態)。
非検査保留状態ありRDエリアが非検査保留状態であるが,ディクショナリ表が検査保留状態のため,整合性をチェックします。
非検査保留状態(NULL値)検査保留状態('C')検査保留状態なしディクショナリ表が不正のため,pdconstckをエラー終了します。
非検査保留状態なし
非検査保留状態(NULL値)2検査保留状態ありRDエリアが検査保留状態のため,整合性をチェックします。
非検査保留状態なしpdconstckは正常状態と判断します(非検査保留状態)。
注※1 
分割表の場合,表を格納する各RDエリア中の表情報によって,検査保留状態又は非検査保留状態になります。各表格納用RDエリア中の表情報による検査保留状態を次の表に示します。

表13-14 各表格納用RDエリア中の表情報による検査保留状態

条件表格納RDエリアの表情報
すべての格納RDエリアのRDエリアの検査保留状態が検査保留状態検査保留状態
格納RDエリアのRDエリアの検査保留状態が検査保留状態と非検査保留状態が混在検査保留状態
すべての格納RDエリアがRDエリアの検査保留状態が非検査保留状態非検査保留状態
注※2 
表の検査保留状態と制約の検査保留状態の整合性が取れていない場合は,pdconstckはエラーで終了します。ディクショナリ表の検査保留状態でのpdconstckの動作を次の表に示します。

表13-15 ディクショナリ表の検査保留状態でのpdconstckの動作

検査保留状態pdconstckの動作
表の検査保留状態制約の検査保留状態
検査保留状態検査保留状態となった制約がある処理続行
すべての制約が非検査保留状態エラー終了
非検査保留状態検査保留状態となった制約があるエラー終了
すべての制約が非検査保留状態処理続行
(b) 制約単位
整合性チェックの順番
制約単位の場合は,制約だけ整合性を検査するため,チェックの順番はありません。
整合性チェックの実行有無
制約単位の整合性チェックでは,表の検査保留状態に関係なく,上記の順に整合性をチェックします。