勝手にデータが置き換わる!

* Amazon データベース設計関連書籍情報
ある人が、お客様から相談を受けました。仮にA子さんとします。
相談の内容はこうです。
「SQL Server のテーブルをリンクして使っているんだけど、データを更新すると、ぜんぜん関係ないレコードまで同じ値になっちゃうんですよ」
A子さんもリンクテーブルを作り、やってみました。が、どうやってもそんな現象は発生しません。
テーブル名に問題があるのかと思い、同じ名前にしてみましたが駄目。
項目名に問題があるのかと思い、同じ名前にしてみましたが駄目。
ODBCドライバに問題があるのかと思い、同じバージョンにしてみましたが駄目。
mdb が破損しているのかと思い、最適化してみましたが駄目。
A子さんの環境ではどーーーーやっても再現しませんが、お客様の環境では必ず100% 絶対に百発百中再現します。
ほとほと疲れ果てたA子さん。SQL Server のテーブルデータと、mdb を送ってもらうことにしました。
数日後、送られてきたデータを確認したA子さんは、ある恐ろしい事実に気づきました。
問題のテーブルには、ユニークインデックスが無かったのです。
リンクテーブルは、リンク先に一意となるインデックスが無い場合、読取専用となりデータを更新することができないはず。
では、ではどうして…?これは、魔法…?
A子さんは、リンクテーブルのデザインを確認しました。すると、驚いた事にそこには主キーが設定されているではないですか。
A子さんは一瞬目の前が真っ暗になりました。
そうです。お客様は、ユニークインデックスが無いテーブルのリンクテーブルを作るときに、Access が出力するダイアログ「固有レコード識別子の選択」で、ぜんぜん一意にならない項目を選択していたのです。
「固有レコード識別子の選択」で指定された項目の値が同じレコードが複数ある場合、そのレコードのうち1つを更新すると他のレコードもぜーんぶ同じ値になってしまうのでした。
…いやぁ。そんな動作になるとは。知らなかったですよ。
(最新バージョンの Access ではどういう動作になるか不明ですが、そもそも一意にならない列にユニーク インデックス設定しちゃだめです。絶対。)