この質問には、いくつかの仮説的な背景が必要です。MySQL を RDBMS として使用して、列、、、employee
を持つテーブルを考えてみましょう。ある人物が別の人物と同じ名前と生年月日を持っている場合、それらは定義上、同じ人物であるため (1809 年 2 月 12 日に生まれたエイブラハム リンカーンという名前の 2 人がいるという驚くべき偶然を除けば)、ユニークキーオンとは「同じ人を二度収納しない」という意味です。ここで、次のデータを検討してください。name
date_of_birth
title
salary
name
date_of_birth
id name date_of_birth title salary
1 John Smith 1960-10-02 President 500,000
2 Jane Doe 1982-05-05 Accountant 80,000
3 Jim Johnson NULL Office Manager 40,000
4 Tim Smith 1899-04-11 Janitor 95,000
次のステートメントを実行しようとすると、失敗するはずです。
INSERT INTO employee (name, date_of_birth, title, salary)
VALUES ('Tim Smith', '1899-04-11', 'Janitor', '95,000')
これを試してみると、成功します:
INSERT INTO employee (name, title, salary)
VALUES ('Jim Johnson', 'Office Manager', '40,000')
そして今、私のデータは次のようになります。
id name date_of_birth title salary
1 John Smith 1960-10-02 President 500,000
2 Jane Doe 1982-05-05 Accountant 80,000
3 Jim Johnson NULL Office Manager 40,000
4 Tim Smith 1899-04-11 Janitor 95,000
5 Jim Johnson NULL Office Manager 40,000
これは私が望んでいることではありませんが、起こったことに完全に同意できないとは言えません。数学的集合の観点から話すと、
{'Tim Smith', '1899-04-11'} = {'Tim Smith', '1899-04-11'} <-- TRUE
{'Tim Smith', '1899-04-11'} = {'Jane Doe', '1982-05-05'} <-- FALSE
{'Tim Smith', '1899-04-11'} = {'Jim Johnson', NULL} <-- UNKNOWN
{'Jim Johnson', NULL} = {'Jim Johnson', NULL} <-- UNKNOWN
私の推測では、MySQL は「生年月日のあるジム・ジョンソンがまだこのテーブルにないことを知らないので、彼を追加します」と言っていると思います。NULL
私の質問は、常に知られているわけではありませんが、どうすれば重複を防ぐことができますか? date_of_birth
これまでに思いついた最善の方法はdate_of_birth
、別のテーブルに移動することです。ただし、これに関する問題は、たとえば、同じ名前、役職、給与、異なる生年月日を持つ 2 人のレジ係がいて、重複せずに両方を保存する方法がなくなる可能性があることです。