Этот вопрос требует некоторого гипотетического фона. Рассмотрим таблицу employee
с столбцами name
, date_of_birth
, title
, salary
, используя MySQL как СУБД. Поскольку, если какое-либо данное лицо имеет то же имя и дату рождения, что и другое лицо, они по определению являются тем же лицом (за исключением удивительных совпадений, когда у нас есть два человека по имени Авраам Линкольн, родившийся 12 февраля 1809 года), мы поставим уникальный ключ на name
и date_of_birth
, что означает «не хранить одного и того же человека дважды». Теперь рассмотрим эти данные:Уникальный ключ с NULL
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
в другую таблицу. Проблема с этим, однако, заключается в том, что я могу получить, скажем, двух кассиров с тем же именем, титулом и зарплатой, разными датами рождения и без возможности хранить их обоих без дубликатов.
Имя и дата рождения НЕ являются уникальными. –
Используйте дату рождения дозорного врача, например. '0000-00-00'. – smilingthax
@Paul Tomblin: Я знаю, что это не так. Разве вы не видите, что это не вопрос? –