参照整合性制約を設定したテーブルを作成することがきます。
しかし、データロードや更新時には参照整合性のチェックは行われません。
そのため、データロード後に関数を使用して参照整合性違反のデータがないかチェックをする必要があります。
以下にINSERT後に参照整合性違反を確認する方法をご紹介します。
目次
実行例
参照整合性に違反したデータがないか確認する実行例を以下に示します。関数の構文
ANALYZE_CONSTRAINTS関数を使用し参照整合性をチェックします。
1 |
dbadmin=> SELECT ANALYZE_CONSTRAINTS('スキーマ名.テーブル名','列名'); |
※列名は省略可能です。
テーブル構成
LINEORDERテーブルのLO_CUSTKEY列に参照整合性制約を定義しています。データ内容
CUSTOMERテーブルとLINEORDERテーブルは参照整合性に違反していないデータ内容となっています。INSERTしたデータが参照整合性の違反をしていない場合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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; COMMIT |
INSERTしたデータが参照整合性の違反をしている場合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
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で確認しています。- 投稿タグ
- constraint, foreign