参照整合性制約を設定したテーブルを作成することがきます。
しかし、データロードや更新時には参照整合性のチェックは行われません。
そのため、データロード後に関数を使用して参照整合性違反のデータがないかチェックをする必要があります。
以下にINSERT後に参照整合性違反を確認する方法をご紹介します。
実行例
参照整合性に違反したデータがないか確認する実行例を以下に示します。
関数の構文
ANALYZE_CONSTRAINTS関数を使用し参照整合性をチェックします。
dbadmin=> SELECT ANALYZE_CONSTRAINTS('スキーマ名.テーブル名','列名');※列名は省略可能です。
テーブル構成
LINEORDERテーブルのLO_CUSTKEY列に参照整合性制約を定義しています。
データ内容
CUSTOMERテーブルとLINEORDERテーブルは参照整合性に違反していないデータ内容となっています。
INSERTしたデータが参照整合性の違反をしていない場合
1.INSERTを実行
dbadmin=> insert into lineorder values(17894054,1,3,2,4130730,71527,8,19950404);
OUTPUT
--------
1
(1 row)
=> 正常にINSERTされます。
2.ANALYZE_CONSTRAINTS関数を使用して参照整合性に違反しているか確認
dbadmin=> select analyze_constraints('public.lineorder');
Schema Name | Table Name | Column Names | Constraint Name | Constraint Type | Column Values
-------------+------------+--------------+-----------------+-----------------+---------------
(0 rows)
=> 関数の実行結果がゼロ件で参照整合性に違反したデータは存在しません。
3.参照整合性に違反したデータが存在しないためCOMMITを実行
dbadmin=> commit;
COMMITINSERTしたデータが参照整合性の違反をしている場合
1.INSERTを実行
(CUSTOMER.C_CUSTKEYに存在しないデータ('4')をLINEORDER.LO_CUSTKEYにINSERT)
↓
dbadmin=> insert into lineorder values(17894054,1,4,2,4130730,71527,8,19950404);
OUTPUT
--------
1
(1 row)
=> 正常にINSERTされます。
2.ANALYZE_CONSTRAINT関数を使用して参照整合性に違反しているか確認
dbadmin=> select analyze_constraints('public.lineorder');
Schema Name | Table Name | Column Names | Constraint Name | Constraint Type | Column Values
-------------+------------+--------------+-----------------+-----------------+---------------
public | LINEORDER | LO_CUSTKEY | C_FOREIGN | FOREIGN | ('4') <== ★参照整合性に違反しているデータ
(1 row)
=> 関数の実行結果に参照整合性に違反しているデータが出力されます。
LINEORDERのLC_CUSTKEY列(外部キー)に参照整合性の違反をしているデータ('4')が存在しています。
3.参照整合性に違反したデータが存在するためROLLBACKを実行
dbadmin=> rollback;
ROLLBACK検証バージョンについて
この記事の内容はVertica 9.1で確認しています。

