这个问题需要一些假设的背景。让我们考虑一个employee
有列的表name
, date_of_birth
, title
, salary
,使用 MySQL 作为 RDBMS。因为如果任何给定的人与另一个人具有相同的名字和出生日期,那么根据定义,他们是同一个人(除非有令人惊奇的巧合,我们有两个人都名叫亚伯拉罕·林肯,出生于 1809 年 2 月 12 日),所以我们将唯一键打开name
and 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 说:“因为我不know吉姆·约翰逊NULL
出生日期尚未在此表中,我将添加他。”
我的问题是:即使如此,我怎样才能防止重复date_of_birth
是不是一直都知道?到目前为止我想到的最好的办法就是搬家date_of_birth
到另一张桌子。然而,这样做的问题是,我最终可能会遇到两个收银员,他们的姓名、头衔和工资相同,出生日期不同,而且无法在不重复的情况下存储他们。