这个问题需要一些假设的背景。让我们考虑一个雇员表,其列名称为date_of_birth,title,salary,使用MySQL作为RDBMS。既然如果任何给定的人与另一个人具有相同的名字和出生日期,那么根据定义,他们是同一个人(除了我们有两个名叫亚伯拉罕·林肯的人在1809年2月12日出生的惊人的巧合之外),我们将放一个名称和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'}
{'Tim Smith', '1899-04-11'} = {'Jane Doe', '1982-05-05'}
{'Tim Smith', '1899-04-11'} = {'Jim Johnson', NULL}
{'Jim Johnson', NULL} = {'Jim Johnson', NULL}
我的猜测是MySQL表示:“既然我不知道吉姆·约翰逊有一个空的出生日期还没有在这张表中,我会补充一下。”
我的问题是:即使date_of_birth并不总是知道的,我如何防止重复?到目前为止,我想出的最好的办法是将date_of_birth移动到不同的表。然而,这个问题是,我可能会说,两位同名,标题和薪水,不同的出生日期的收银员,没有办法存储他们没有重复。