“21天”好习惯第一期-20

参照完整性

定义

关系模型的参照完整性定义
CREATE  TABLE 中用 FOREIGN KEY 短语定义哪些列为外码
REFERENCES 短语指明这些外码参照哪些表的主码

例如

关系SC中一个元组表示一个学生选修的某门课程的成绩,(SnoCno)是主码。SnoCno分别参照引用Student表的主码和Course表的主码

定义SC中的参照完整性

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)    
          /*在表级定义参照完整性*/
      );

 

检查和违约处理

可能破坏参照完整性的情况及违约处理

被参照表(例如Student

参照表(例如SC

违约处理

可能破坏参照完整性

    插入元组

拒绝

可能破坏参照完整性

    修改外码值

拒绝

删除元组

   可能破坏参照完整性

拒绝/级连删除/设置为空值

修改主码值

    可能破坏参照完整性

拒绝/级连修改/设置为空值

参照完整性违约处理
1. 拒绝 (NO ACTION) 执行
默认策略
2. 级联 (CASCADE) 操作
3. 设置为空值( SET-NULL
对于参照完整性,除了应该定义外码,还应定义 外码列是否允许空值

例如

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

    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) 
		ON DELETE CASCADE     /*级联删除SC表中相应的元组*/
                ON UPDATE CASCADE, /*级联更新SC表中相应的元组*/
         FOREIGN KEY (Cno) REFERENCES Course(Cno) 	                    
               ON DELETE NO ACTION 	
               /*当删除course 表中的元组造成了与SC表不一致时拒绝删除*/
               ON UPDATE CASCADE   
      	/*当更新course表中的cno时,级联更新SC表中相应的元组*/
        );

用户定义的完整性

用户定义的完整性就是针对 某一具体应用 的数据必须满足的语义要求
RDBMS 提供,而不必由应用程序承担

定义

CREATE TABLE 时定义
列值非空( NOT NULL
列值唯一( UNIQUE
检查列值是否满足一个布尔表达式( CHECK

1.不允许取空值  

例如

在定义SC表时,说明SnoCnoGrade属性不允许取空值。

    CREATE TABLE SC
      (Sno  CHAR(9)  NOT NULL,	
          Cno  CHAR(4)  NOT NULL,	
          Grade  SMALLINT NOT NULL,	
          PRIMARY KEY (Sno, Cno),  
          /* 如果在表级定义实体完整性,隐含了Sno,Cno不允许取空值,则在列级不允许取空值的定义就不必写了 * /
        ); 

2.列值唯一  

例如

建立部门表DEPT,要求部门名称Dname列取值唯一,部门编号Deptno列为主码

    CREATE TABLE DEPT
        (Deptno  NUMERIC(2),
          Dname  CHAR(9)  UNIQUE,/*要求Dname列值唯一*/
          Location  CHAR(10),
          PRIMARY KEY (Deptno)
       );
3. CHECK 短语指定列值应该满足的条件

例如

Student表的Ssex只允许取“男”或“女”。

    CREATE TABLE Student
        (Sno  CHAR(9) PRIMARY KEY,
          Sname CHAR(8) NOT NULL,                     
          Ssex  CHAR(2)  CHECK (Ssex IN (‘男’,‘女’) ) ,                
              /*性别属性Ssex只允许取'男'或'女' */
          Sage  SMALLINT,
          Sdept  CHAR(20)
        );

 

 

 

 

 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值