重复记录(duplicate record) 是第二行数据,它描述的是与已有行相同的真实对象。它之所以重要,是因为数据库是按行来计数的,每个重复行都会被当成另一个人、产品或订单。计数、总和与平均值于是描述了一些并不存在的东西。
实操题会要求你找出重复记录、删除它,并说明它为什么重要。本课属于数据库结构与验证,使用与前几课相同的虚构俱乐部数据。
如何发现重复记录?
结合主键和其他字段一起使用。
- 按描述性字段排序,例如 Name,让几乎相同的行排在一起。
- 比较其他字段。 姓名相同、加入日期相同、费用也相同,强烈暗示同一个人被输入了两次。
- 检查主键。 ID 不同并不代表是不同的人。那一行可能是用新 ID 重新输入的。
- 决定保留哪一行。 保留原来的那行,通常是较早的一行,删除多余的。如果不确定,删除前先对照源资料。
两个人可能同名,所以仅凭姓名相同并不能证明什么。要比较不止一个字段。
例题详解
虚构的自行车俱乐部在一次粗心的第二次导入之后,表格如下:
| MemberID | Name | DateJoined | Fee |
|---|---|---|---|
| M001 | Aiman Rahim | 2024-03-15 | 45.50 |
| M002 | Mei Ling Tan | 2024-04-02 | 45.50 |
| M003 | Kumar Raj | 2024-05-20 | 30.00 |
| M004 | Sofia Lim | 2024-06-11 | 45.50 |
| M005 | Daniel Ong | 2024-07-01 | 30.00 |
| M006 | Kumar Raj | 2024-05-20 | 30.00 |
第一步,按 Name 排序。 两行 Kumar Raj 排在一起。
第二步,比较。 Name、DateJoined 和 Fee 都相同,只有 MemberID 不同(M003 和 M006)。这是同一个人被输入了两次。
第三步,衡量影响。 表格显示 6 条记录,但真实会员只有 5 位。含重复行的费用总额是 45.50 + 45.50 + 30.00 + 45.50 + 30.00 + 30.00 = 226.50,真实总额是 196.50。
第四步,用另一种方法验算。 三笔 45.50 是 136.50,三笔 30.00 是 90.00,136.50 + 90.00 = 226.50。去掉一笔 30.00,总额就是 196.50。
第五步,核对平均费用。 含重复行:226.50 除以 6 = 37.75。去掉后:196.50 除以 5 = 39.30。重复行使平均值降低了 1.55,因为 39.30 - 37.75 = 1.55。
第六步,修正。 删除 M006 这一行,保留 M003。然后确认记录数显示为 5。
考试时可以这样写: 重复记录使俱乐部看起来有 6 位会员而不是 5 位,并使费用收入多算了 30.00。依据这张表制作的报告就不准确。
要留意的错误
常见的失误是以为主键就能保护表格不出现重复记录。
错误想法: 表格在 MemberID 上设了主键,所以不可能有重复记录。
主键只能阻止两行拥有相同的 MemberID。M003 和 M006 是不同的值,所以两行都被接受了,尽管它们描述的是同一个人。
改正的方法是说清楚主键能做什么、不能做什么。它防止键值重复,但它不知道两个不同的 ID 其实属于同一个真实的人。要防止这种情况,需要在输入数据时检查、与已有记录对比,并定期复查。
自我检测
1. 一张有 40 条记录的表含有 4 条重复记录。真实的项目有多少个?
查看答案
36。 40 - 4 = 36,因为每条重复记录都是已列出项目的多余一行。
2. 每条记录的费用都是 25.00。表中 40 条记录仍含有 4 条重复记录,显示的总额是多少?真实总额是多少?
查看答案
显示的总额:40 × 25.00 = 1000.00。真实总额:36 × 25.00 = 900.00。重复记录使总额多算了 100.00。
3. 两行的 Name 相同,但出生日期不同。它们一定是重复记录吗?
查看答案
不一定。 两个不同的人可能同名。出生日期不同,说明他们很可能是不同的人。删除任何东西之前,要比较更多字段。
下一步
现在到数据库结构与验证练习题组里试做整个单元。如果重复记录造成了令人意外的总额,发现数字与文本的错误解读会告诉你总额异常的另一个原因。ICT 实操任务与证据检查器可帮助你列出完成数据库任务之前要核对的事项。
学生往往很容易找到重复记录,却在解释时失分。ICT 线上一对一补习的老师可以用新的表格陪你练习简短而准确的答案。