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