「インデックス、主キー、またはリレーションシップで値が重複…」のエラーが出る原因

 「インデックス、主キー、またはリレーションシップで重複する値が生成されるため…」というよくあるエラーについてです。
 これは、その列が(主キー、またはインデックスの設定により)値の重複を許さない設定になっているのが原因ですが、実際の例を見てみます。
 なお、主キー、インデックスそしてリレーションシップはいずれも重要な設定です。エラーが出るからといって設定を変えてしまうととんでもないことになる恐れがありますので、特に実務に用いているファイルにおいては注意してください。

主キーにより値の重複が許されない設定になっている例

f:id:accs2014:20180708123606p:plain:right:w500

 さて、サンプルとしてこのようなテーブルがあります。
 10行目のレコードにおいて「社員コード」列の値を、既に存在する値「9」としたうえで、行の入力を確定しようとしたところ…


f:id:accs2014:20180708123603p:plain:right:w650

 出ました。「インデックス、主キー、またはリレーションシップで重複する値が生成されるため、テーブルを変更できませんでした。重複する値のあるフィールドの値を変更するか、インデックスを削除してください。または重複する値を使用できるように再定義してください。」という長いエラーメッセージです。
 初心者のうちは何が問題でどうすればいいのか、まるで見当がつかないかもしれません。


f:id:accs2014:20180708123600p:plain:right:w400

 そこで設定画面であるデザインビューをみてみます。
 「社員コード」の左端に鍵マークがあります。これは社員コード列が主キーとなっていることを意味しています。主キーとなっている列においては値の重複が許されないのでエラーが出たというわけです。
 通常は意図的に主キーを設定しているので、エラーが出るからといって設定を変えるのではなく、単に「他の行と重複する値を入力しない」というのが本来正しい対応です。
 設定を変えて「社員コード」を主キーでない状態にすれば(操作は下記の例を参照)値が重複してもエラーは出なくなりますが、レコードの区別がつかなくなり大きな問題を引き起こす恐れがありますので、慎重な判断が必要です。

 主キーはとても重要な設定ですので、詳しくは次の記事を参照ください。

www.accessdbstudy.net


f:id:accs2014:20180708123557p:plain:right:w650

 次に別のテーブルの例をみてみます。
 このテーブルでは「部署コード」が主キーとなっており、重複する値を入力しようとすると上記と同じエラーが出ます。
 これも本来「他の行と重複する値を入力しない」というのが正しい対応ですが…


f:id:accs2014:20180708123554p:plain:right:w400

 試しに主キーを外してみることにします。すると…


f:id:accs2014:20180708124033p:plain:right:w600

 「主キーを変更できません」とエラーが出ます。よく読むと、さらに「このテーブルは、リレーションシップの主テーブルとなっています。」といったメッセージが続いています。


f:id:accs2014:20180708124030p:plain:right:w400

 これは、部署テーブルと社員テーブルの間で(部署コード列を介した)リレーションシップの設定がされているためです。
 リレーションシップの画面を開き、両方のテーブルの間に設定されているリレーションシップを削除(線を右クリックして「削除」を選択)した上で、部署テーブルの部署コードを主キーでなくすれば、部署コードの値が重複してもエラーは出なくなります。

 リレーションシップも非常に重要な設定です。なかなか難しいものですので、詳しくは次の記事のほか関連記事を参照ください。

www.accessdbstudy.net


インデックスにより値の重複が許されない設定になっている例

f:id:accs2014:20180708124027p:plain:right:w650

 さて、上記の例と同じ社員テーブルです。
 「あだな」列において、ほかの行と重複する値を入力してみます。「あだな」列は主キーではありませんが、入力を確定したところエラーが出ました;-o-)


f:id:accs2014:20180708124024p:plain:right:w500

 そこでデザインビューを開き、メニューから「インデックス」を選びます。


f:id:accs2014:20180708124021p:plain:right:w600

 ウインドウが現れますので「あだな」を選択します。
 すると、下部に表示されているプロパティのうち「固有」の値が「はい」となっているのがわかります。この設定により、「あだな」列は値の重複が許されなくなっています。
これがエラーの原因です。これを「いいえ」にすれば値が重複してもエラーになりませんが、やはり本来は値の重複を避けるべきで、設定の変更には慎重な判断が必要です。

 インデックスについては次の記事を参照してください。

www.accessdbstudy.net


まとめ

 くどいですが、主キー、インデックス、リレーションシップはいずれも「データの正しさ」に関わる重要な設定です。原則として「重複する値を入力しない」という制約に従うこととし、くれぐれも作成者等への相談なしに設定を変えることのないようご注意ください_ _)