这个问题需要一些假设的背景。让我们考虑一个employee
具有列name
, date_of_birth
, title
,的表salary
,使用 MySQL 作为 RDBMS。因为如果任何给定的人与另一个人有相同的名字和出生日期,根据定义,他们就是同一个人(除非有两个人名叫亚伯拉罕林肯的惊人巧合出生于 1809 年 2 月 12 日),我们将放置一个唯一键打开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
出生日期的 Jim Johnson 不在此表中,所以我将添加他。”
我的问题是:即使date_of_birth
并不总是知道,我如何才能防止重复?到目前为止,我想出的最好的办法是搬到date_of_birth
另一张桌子上。然而,这样做的问题是,我最终可能会得到两个名字、头衔和薪水相同、出生日期不同的收银员,并且无法在没有重复的情况下存储它们。