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