1. 减少数据冗余。
2. 尽量避免数据维护中出现更新,插入和删除异常。
插入异常: 如果表中的某个实体随着另一个实体而存在
更新异常:如果更改表中的某个实体的单独属性时,需要对多行进行更新
删除异常:如果删除表中的某一实体则会导致其他实体的消息
3. 节约存储空间
4. 提高SQL的查询效率
如何理解插入异常?
假设这是我们当前设计的表结构。在这个表,存在着两个实体。其中一个实体是学生信息,另一个实体是课程信息。PRIMARY KEY (study_no,course_name) 表明一个学生只能选择相同的课程一次。当前我们只插入以下语句时,
insert into selectcourse(course_name, course_point) values('语文', 10)
则会产生异常。在没有学生选择这门课时,无法把新课程插入到表中。这也就是表中的某个实体随着另一个实体而存在。
CREATE TABLE `selectcourse` (
`study_no` int NOT NULL COMMENT '学号',
`study_name` varchar(10) COLLATE utf8mb4_general_ci NOT NULL COMMENT '姓名',
`birth_date` timestamp NOT NULL COMMENT '生日',
`course_name` varchar(10) COLLATE utf8mb4_general_ci NOT NULL COMMENT '课程名称',
`score` int DEFAULT NULL COMMENT '成绩',
`course_point` int NOT NULL COMMENT '学分',
PRIMARY KEY (`study_no`,`course_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
如何理解更新异常呢?
mysql> select * from selectcourse;
+----------+------------+---------------------+-------------+-------+--------------+
| study_no | study_name | birth_date | course_name | score | course_point |
+----------+------------+---------------------+-------------+-------+--------------+
| 1 | 张三 | 2021-01-26 14:32:36 | 数学 | NULL | 10 |
| 1 | 张三 | 2021-01-26 14:34:53 | 英语 | NULL | 9 |
| 2 | 李四 | 2021-01-26 14:35:26 | 数学 | NULL | 10 |
| 2 | 李四 | 2021-01-26 14:35:47 | 英语 | NULL | 9 |
+----------+------------+---------------------+-------------+-------+--------------+
4 rows in set (0.00 sec)
假设我们要更新数学该科目的学分:
update selectcourse set course_point=15 where course_name='数学'
我们会看到以下执行结果:
mysql> update selectcourse set course_point=15 where course_name='数学';
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2 Changed: 2 Warnings: 0
我们可以看到其更新了2行数据。这也就意味着选择该科目的学员越多,更新的学分【行】也就越多。这就是更新异常的具体表现。