参照整合性の設定時における代表的なエラーと対応例

 リレーションシップ自体なかなか難しいものですが、特に参照整合性を設定しようとする場合にはさまざまなチェックが働くためいろいろなエラーが起こりえます。また、エラーが生じてもどこに問題があるのかわかりにくい場合も多いです。ここでは代表的なエラーメッセージと基本的な対応例を示します。

 例として、ある事業者の取引先を記録する「取引先テーブル」と、各取引先に対する販売の事実をその都度記録する「販売テーブル」という2つのテーブルを用いて、両方のテーブルにある「取引先コード」列の間で参照整合性を設定するものとします。右の画像は実際のデータの例ですが、エラーを発生させるにあたっては若干変更を加えています。


「主テーブルで参照されているフィールド用の固有インデックスが見つかりません。」の場合

 ちょっとわかりにくいメッセージですが、参照される側の列の設定に問題があります。つまり、値の重複が許される設定になっているのが問題であり、そのせいでエラーとなっています。
 なぜ問題なのでしょうか。この例に即していうと、参照されているのは取引先テーブルの取引先コードです。この取引先コードの値の重複が許されていると、販売テーブルの方に記録されている販売先コードがどの取引先を指しているのか、区別がつかなくなってしまう恐れがあるからです。実際に記録されている値に重複がなくとも、重複を許す設定にしている時点でこのエラーは避けられません。


 重複を許さない設定にするには、その列を主キーとして設定すればOKです(重複なしのインデックスを設定することでも可能です)。
 ちなみに、参照されている側の列について重複を許したい(つまり、参照整合性を設定しようとするどちらの列についても重複を許したい)ということがあるとすれば、それらの列は(同名、同データ型であっても)そもそも参照関係になく、参照整合性を設定する必要性はないはずですので注意してください。


 再び参照整合性の設定をしてみます。先ほどは「リレーションシップの種類」が「未定義」だったのが、「一対多」に変化しているのがわかります。主キーの設定を行ったことにより、取引先テーブルの取引先コードが「参照される側(一側)」であり、販売テーブルの取引先コードが「参照する側(多側)」であることが明確になったためです。


 今度はきちんと設定できました。


「リレーションシップは、同じデータ型で同じ数のフィールドに設定する必要があります。」の場合

 これはまあ書いてあるとおりで、たいていの場合2つの列のデータ型が一致していないのが原因です。


 この例の場合、取引先テーブルの取引先コードのデータ型が「短いテキスト」、一方で販売テーブルの取引先コードのデータ型が「数値型」でしたので、数値型に統一することとしました。これでエラーは解消します。


「このリレーションシップを作成して、参照整合性を設定できません。」の場合

 テーブルの設定自体に問題がなくとも、すでに記録されているデータの整合性に問題がある、つまりデータに矛盾がある場合にこのエラーが出ます。


 実際に両方のテーブルを開いてみると、取引先テーブルに記録されている取引先コードは1から3までしかないのに、販売テーブルに記録されている取引先コードに「4」という値が見つかりました。これが指摘されたデータの矛盾です。
 この場合、実際の販売の内容を確認したうえで、以下のいずれかを行います。

・販売の事実そのものが誤りであったのであれば行を削除する(販売テーブルの6行目を削除する)。
・販売先が、取引先テーブルに記録されている3つのいずれかであったのであれば値を訂正する(販売テーブルの6行目の「4」という値を1から3のいずれかに変更する)。
・新しい販売先に販売したものであれば、取引先テーブルに新たな行を追加する(その取引先コードは「4」とする)。

これでエラーは発生しなくなります。