MySQL(一) 数据库完整性约束

三、数据库完整性


3.1维护完整性的三个条件

  1. 提供定义完整性约束条件的机制
  2. 提供完整性检查方法
  3. 违约处理

3.2完整性分类

  • 实体完整性:主码不能为空。
  • 参照完整性:外码所对应的值必须为对应表的主码或空值。
  • 用户定义完整性:某些属性值要收用户的定义而被约束。

     

3.3实体完整性

3.3.1完整性定义

在创建表时(create table),使用primary key定义。

[例]:

CREATE TABLE Student
(Sno CHAR(9) PRIMARY KEY
 Sname CHAR(20) NOT NULL
 Ssex CHAR(2)
 Sage SMALLINT
 Sdept CHAR(20)
)

CREATE TABLE Student
(Sno CHAR(9)
 Sname CHAR(20) NOT NULL
 Ssex CHAR(2)
 Sage SMALLINT
 Sdept CHAR(20)
 PRIMARY KEY (Sno)
)

Sno即为定义的主码。

3.3.2完整性检查和违约处理

实体完整性有两项自动检查,

  1.  检查主码值是否唯一,如果不唯一则拒绝插入或修改

  2. 检查主码值是否为空,为空则拒绝插入或修改

为了方便检查主码会自动创建索引,索引的存储格式为b+数,具体实现请参照“数据结构 b树”的讨论。


3.4参照完整性

3.3.1参照完整性定义

在create table中使用foreign key短语来定义哪些列为外码,用reference短语来指明这些外码参照哪些表的主码。

[例]:

CREATE TABLE SC
(Sno CHAR(9) NOT NULL,
 Cno CHAR(4) NOT NULL,
 Grade SMALLINT,
 PRIMARY KEY (Sno,Cno),
 FOREIGN KEY (Sno) REFERENCE Student(Sno),
 FOREIGN KEY (Cno) REFERENCE Course(Cno)
);

上段代码为表SC定义了表级约束条件主码为Sno和Cno,同时Sno,Cno分别为表Student,Course的外码。

3.3.2参照完整性检查和违约处理

以SC表和Student表为例,破坏参照完整性的情况大致有一下四种情况。

  1. SC表中增加一个元组,元组的Sno属性在Student中找不到。

  2. 修改SC表中的元组,Sno属性在Student中找不到。

  3. 从Student表中删除一个元组,使SC表中的Sno属性在表Student中找不到对应元组。

  4. 修改Student表,使SC表中的Sno属性在表Student中找不到对应元组。

可能破坏参照完整性的情况和违约处理
被参照表参照表 违约处理
可能破坏参照完整性插入元素拒绝
可能破坏参照完整性修改外码值拒绝
删除元组可能破坏参照完整性拒绝/级连/置空
修改主码值可能破坏参照完整性拒绝/级连/置空

显示说明参照完整性违约处理示例。

 

 

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值