插入异常

时间:2012-10-21 14:04:17

标签: sql database relation relational-algebra

我正在学习来自here的插入异常。以下数据写在其中,

插入异常

如果在没有其他属性的情况下无法将某些属性插入数据库,则会发生插入异常。例如,这与删除异常相反 - 除非我们至少有一名学生注册该课程,否则我们无法添加新课程。

StudentNum  CourseNum   Student Name    Address     Course
S21         9201        Jones           Edinburgh   Accounts
S21         9267        Jones           Edinburgh   Accounts
S24         9267        Smith           Glasgow     physics
S30         9201        Richards        Manchester  Computing
S30         9322        Richards        Manchester  Maths

我不理解这个概念。为什么我们需要一名学生参加课程才能存在?

提前致谢

3 个答案:

答案 0 :(得分:7)

这意味着架构未规范化,即现在您拥​​有表Student中有关课程的信息。

因此,为了插入课程详细信息,您还需要提供学生的详细信息。

您需要了解different forms of normalization,但在此示例中,解决此异常的正确途径最有可能是创建三个表,即strong entity types Student,{{1 }},以及associative entity type linking table Course(可能称为StudentCourseRegistration),它可以让您存储学生和课程数据,而不会出现重复和异常,以及为许多学生分配了许多课程。

您可以阅读以下链接中的规范化示例,它会为您提供更好的建议:

http://www.sqa.org.uk/e-learning/MDBS01CD/page_26.htm#Example

答案 1 :(得分:5)

该示例假设studentnum和coursenum形成实现完整性规则的复合主键,学生不能多次在同一课程中注册,即组合是独特的。因此,尝试添加课程记录也需要学生。为了在保持完整性规则的同时避免这种情况,复合密钥在关联实体和课程中实现,学生在不同的实体中。

答案 2 :(得分:0)

插入异常:根据上面的示例,其中只有一个表具有所有属性。现在,我想介绍新课程,那么我必须了解student id(想要学习该课程的学生),这是一个主键,不能为空。根据表格,您必须知道primary key(student id)。如果您想输入其他字段,但是现在我们只有新课程的详细信息,而无需注册学生。因此,您不能只输入新课程并将主键留空。这是插入异常。