Этот вопрос требует некоторой гипотетической подоплеки. Рассмотрим таблицу сотрудников
, в которой есть столбцы 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
в другую таблицу. Проблема, однако, в том, что я могу получить, скажем, двух кассиров с одинаковым именем, титулом и окладом, разными датами рождения и невозможностью сохранить их обоих, не имея дубликатов.