Уникальный ключ с NULL

Этот вопрос требует некоторой гипотетической подоплеки. Рассмотрим таблицу сотрудников , в которой есть столбцы name , date_of_birth , title , salary , используя MySQL в качестве СУБД. Поскольку если какое-либо лицо имеет то же имя и дату рождения, что и другое лицо, они, по определению, являются один и тот же человек (за исключением удивительных совпадений, когда у нас есть два человека по имени Авраам Линкольн, родившиеся 12 февраля 1809 года), мы добавим уникальный ключ к 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 в другую таблицу. Проблема, однако, в том, что я могу получить, скажем, двух кассиров с одинаковым именем, титулом и окладом, разными датами рождения и невозможностью сохранить их обоих, не имея дубликатов.

38
задан Jason Swett 2 November 2010 в 20:35
поделиться