思维导图:
5.2.1 定义参照完整性
5.2 参照完整性笔记:
一、概念
- 参照完整性 (Referential Integrity):确保关系数据库中的数据表间的关系始终保持一致性。
- 外键 (Foreign Key):一个表中的列或列组,用于标识另一个表中的唯一记录。
二、定义参照完整性
- 使用
FOREIGN KEY
关键词定义外键。 - 使用
REFERENCES
关键词指明外键对应的主键所在的表和列。
三、示例说明
- 在关系SC中,
Sno
和Cno
作为复合主键代表学生的选课记录。其中:Sno
是学生编号,参照Student表的主码。Cno
是课程编号,参照Course表的主码。
代码示例 [例5.3]:
CREATE TABLE SC (
Sno CHAR(9) NOT NULL,
Cno CHAR(4) NOT NULL,
Grade SMALLINT,
PRIMARY KEY(Sno,Cno),
FOREIGN KEY(Sno) REFERENCES Student(Sno),
FOREIGN KEY(Cno) REFERENCES Course(Cno)
);
此代码展示了如何在创建SC表时定义实体完整性和参照完整性。
四、注意事项
- 在表级定义完整性:在本例中,我们在表级别定义了实体完整性(通过
PRIMARY KEY
)和参照完整性(通过FOREIGN KEY
)。 - 确保参照的主键存在:在插入或修改记录时,外键所参照的主键必须存在于被参照的表中,否则将违反参照完整性。
- 删除或修改主键值的注意:当尝试删除或修改一个被外键参照的主键值时,必须特别小心,因为这可能导致数据不一致。
通过理解和应用参照完整性的概念,我们可以确保数据库中的数据始终保持一致性和完整性。
什么是参照完整性?
参照完整性是关系数据库中的一种完整性约束,确保数据之间的一致性和引用关系的有效性。以下是参照完整性概念的深入解释:
-
基本定义:参照完整性确保在一个表中的外键必须匹配另一个表中的主键或者是NULL。
-
理解引用关系:想象一个学生注册系统。每个学生都在一个特定的专业中。在“学生”表中,你可能有一个“专业ID”的字段作为外键,这个外键指向“专业”表中的主键。“专业”表中列出了所有可能的专业。参照完整性确保每个学生的“专业ID”要么是NULL,要么确实存在于“专业”表中。这确保了学生不能被分配到一个不存在的专业。
-
保护数据完整性:参照完整性的主要目的是防止数据不一致性。使用上述的例子,如果没有参照完整性,可能会有学生的记录显示他们在一个不存在的专业中,这将导致数据不准确和混淆。
-
违约处理:当试图进行破坏参照完整性的操作时(例如,尝试插入一个在“专业”表中不存在的专业ID到“学生”表中),数据库通常会阻止这种操作。数据库提供了几种违约处理策略,如拒绝操作、级联删除/更新或设置为NULL。
-
灵活性与规则:虽然参照完整性为数据库提供了结构和规则,但它还提供了一定的灵活性。例如,外键可以是NULL,表示在参照的表中没有相应的值。这在某些场景中是有意义的,如上面的例子中,学生可能还没有选择专业。
-
设计的重要性:在数据库设计时,确定正确的主键和外键关系至关重要。一个良好的设计可以确保数据的一致性,简化查询,同时也能为将来的数据增长提供结构。
总的来说,参照完整性是关系数据库中确保数据质量和准确性的一种方法,通过保证在一个表中引用的信息在另一个表中真实存在。
类比可以很好的解释这个问题:
当然可以,我们可以使用一些日常生活中的例子和类比来解释参照完整性。
类比1:图书馆与书籍 想象一个图书馆和读者。图书馆有很多书籍,每本书都有一个唯一的编号。读者可以借书,当他们借书时,他们的借书记录中会有这本书的编号。
- 参照完整性:确保读者借的每本书的编号在图书馆的书籍列表中都能找到。没有参照完整性的话,就像读者借了一个图书馆根本不存在的书,这显然是不合逻辑的。
类比2:机场与航班 想象一个大型机场和乘客。每一个出发的或到达的航班都有一个唯一的航班号。乘客购买的机票上都会印有这个航班号。
- 参照完整性:确保每一个机票上的航班号都对应一个实际存在的航班。没有参照完整性就像你买了一个机票,但机场里根本没有这个航班,这是不可能的。
类比3:超市与商品 想象你去超市购物。每一种商品都有一个唯一的条形码。当你结账时,收银员会扫描每件商品的条形码来计算总价。
- 参照完整性:确保每一个扫描的条形码在超市的商品数据库中都有对应的商品和价格。没有参照完整性的话,就像收银员扫描了一个商品,但在超市的系统里找不到这个商品,这显然是不应该发生的。
通过这些日常生活的例子,参照完整性可以被理解为确保我们的"引用"或"提及"(如书的编号、航班号、商品条形码)在其对应的"源"或"列表"中(如图书馆的书籍列表、机场的航班表、超市的商品数据库)真实存在。
5.2.2 参照完整性检查与违约处理笔记:
一、概念
- 参照完整性:确保两个或多个表间数据的一致性。
- 违约处理:当某一操作可能破坏参照完整性时,数据库的反应和处理方式。
二、可能破坏参照完整性的操作及违约处理
三、具体情况说明
- 插入或修改参照表中的元组,而对应的值在被参照表中不存在。
- 从被参照表中删除元组,导致参照表中存在孤立的引用。
- 修改被参照表中的主键值,导致参照表中存在孤立的引用。
四、违约处理策略
- 拒绝(NOACTION):默认策略,不允许执行该操作。
- 级联(CASCADE):删除或修改被参照表的元组时,相应地删除或修改参照表中相关的所有元组。
- 设置为空值:删除或修改被参照表的元组时,将参照表中相关元组的外键列设置为空值。
五、注意事项
- 外码接受空值:根据应用场景,某些外码列可以接受空值。但若外码同时是实体的主属性,例如SC中的Sno,那么它不应取空值,因为按实体完整性规则,主属性不能为空。
- 明确违约处理策略:在定义外键时,可以指定违约处理策略。例如,
ON DELETE CASCADE
意味着当删除被参照表的元组时,会级联删除参照表中的相关元组。
六、代码示例 [例5.4]
CREATE TABLE SC (
Sno CHAR(9),
Cno CHAR(4),
Grade SMALLINT,
PRIMARY KEY(Sno,Cno),
FOREIGN KEY(Sno) REFERENCES Student(Sno) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY(Cno) REFERENCES Course(Cno) ON DELETE NO ACTION ON UPDATE CASCADE
);
此示例中:
- 删除Student表中的元组时,会级联删除SC表中的相关元组。
- 删除Course表中的元组时,会拒绝该删除操作,而更新Course表中的cno时,会级联更新SC表中的相关元组。
总结
参照完整性的实现除了定义主码和外码外,还要根据应用环境的要求确定合适的违约处理策略。
总结:
重点:
- 定义:参照完整性是确保数据库中的数据在各个表之间保持一致性和准确性的一个重要概念。
- 外键 (Foreign Key):外键是一个表中的列或列组合,其值必须与另一个表的主键值匹配。外键用于确保两个表之间的参照完整性。
- 完整性约束:确保当在一个表中插入、更新或删除数据时,不会破坏数据库中其他表的数据一致性。
难点:
- 级联操作:例如,如果你删除一个记录,可能需要级联删除其他相关的记录以保持数据完整性,这需要深入的理解和正确的实现。
- 循环参照:可能出现两个或多个表之间相互参照的情况,这在处理时可能会引起混淆。
- 多对多关系:需要通过中间表来实现,有时可能难以设置正确的参照完整性规则。
易错点:
- 不正确地设置外键:如果外键设置不正确,可能导致不正确的数据插入或更新。
- 忽略完整性约束:在进行数据操作时,例如删除记录,可能会忽略与其他表的关系,导致数据不一致。
- 错误的级联操作:可能在不需要的时候进行级联删除,或在需要的时候没有进行。
- 性能问题:如果参照完整性规则设置得过于复杂,可能会对数据库的性能产生影响。
理解和实现参照完整性是数据库设计和维护中的一个关键任务,确保数据的完整性和一致性至关重要。