数据库完整性—-摘自《数据库系统概论》纯手打总结

###第五章 数据库完整性

        数据库的完整性是指数据的正确性和相容性。
             1、提供定义完整性的约束条件的机制
             2、提供完整性检查的方法
             3、进行违约处理

        ####5.1实体完整性
                5.1.1定义实体完整性
                 关系模型的实体完整性在CREATE table中用PRIMARY KEY 定义。
                 对单属性构成的码有两种说明方法,
                 一种是定义为列级约束条件。
                 一种是定义为表级约束条件。
            【例】CREATE table student (
                        Sno CHAR(9) PRIMARY key,   注意 /*在列级定义主码*/PRIMARY key是跟在属性后面的
                        Sname char(20) Not NUll,
                        Sage CHAR(5),
                        Sdept CHAR(5)
                    );
            【例】CREATE table student (
                        Sno CHAR(9),  
                        Sname char(20) Not NUll,
                        Sage CHAR(5),
                        Sdept CHAR(5),
                        PRIMARY KEY(Sno)注意 /*在表级定义主码*/PRIMARY key(Sno)是当作属性设置进去的
                    );
            【例】将SC表中的Sno、Cno属性定义为码
            create table SC(
                        Sno CHAR(9) Not NUll,   
                        Cno char(20) Not NUll,
                        Grade CHAR(5),
                        Sdept CHAR(5),
                        PRIMARY KEY(Sno,Cno)
                    )
                5.1.1实体完整性检查和违约处理             
        ####5.2参照完整性

            #####5.2.1定义参照完整性
            
                关系模型的参照完整性在CREATE TABLE中用 FOREIGN KEY 短语定义那些列为外码,用 PEFERENCES 短语指明
                这些外码参照那些表的主码。
                例如,关系 CS中的一个元组表示一个学生选修的某门课程的成绩,(Sno,Cno)是主码。Sno、Cno分别参照引用
                student表中的主码和Course表中的主码

                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),
                );
            #####5.2.2参照完整性检查和违约处理
                参照完整性将两个表中的相应元组联系起来了。因此,对被参照表的参照表进行增、删、改操作时有可能破坏参照完整性,
                必须进行检查以保证这两个表的相容性。

                当发生不一致时,系统可以采用以下策略加以处理。
                (1)拒绝(NO ACTUON)执行
                不允许该操作执行,该策略一般设置为默认策略
                (2)级联操作
                当删除或修改被参照表(Student)的一个元组导致与参照表SC不一致时,删除或修改参照表中的所有导致不一致的元组。
                【例】删除Student表中Sno值为“201215121”的元组,则从要SC表中级联删除SC.Sno=’201215121’的所有元组。
                (3)设置为空值
                当删除或修改被参照表的一个元组导致不一致时,则将参照表中的所有造成不一致的元组的对应属性设置为空值。
                注意:这里讲下外码能否接受空值。
                在数据库中外码是不能取空值的,因为Sno、和Cno是在其他表中的主键,所以是不能取空值的。
                    因此对于参照完整性,出了应该定义外码,还应定义外马列是否允许空值。
                    一般的,当对参照表和被参照表的操作违反了参照完整性是,系统选用默认策略,即拒绝执行。如果想让系统
                    采用其他策略,必须在创建参照表时显示的加以说明

                    【例】显示的说明参照完整性的违约处理示例
                    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,               /*当删除Student表中的Sno时,级联删除SC表中相应的元组*/
                              ON UPDATE cascADE,                  /*当更新Student表中的Sno时,级联更新SC表中相应的元组*/
                    FOREIGN key(Cno) REFERENCES Course(Cno) 
                             ON DELETE NO ACTUON,              /*当删除Course表中的元组造成与SC表不一致时,拒绝删除*/
                             NO UPDATE CASEADE                  /*当更新Course表中的Cno时,级联更新SC表中相应的元组*/
                    );

             
            ####5.3用户定义完整性
                    5.3.1属性上的约束条件       
                        在Create table 中定义属性的同事,可以根据应用要求定义属性上的约束条件即属性值限制,包括:
                        ① 列值非空(not null)
                        ② 列值唯一(UNIQUE)
                        ③ 检查列值是否满足一个条件表达式(CHECk短语)

                        (1)不允许取空值(NOT NULL)
                        【例】在定义SC表时,说明Sno和Cno、Grade属性不允许取空值
                        Create table SC
                            (Sno char(9) not null,
                              Cno char(4) not null,
                              Cno char(4) not null,
                             Grade SMALLINT,
                            )
                        (2)列值唯一(UNIQUE)
                        建立部门表Dept,要求部门名称Dname列值唯一,部门编号Deptno列为主码
                         CREATE TABLE DEPT
                            (Deptno NUMERIC(2),
                                Dname CHAR(9) UNIQUE NOT null,/*要求列值唯一,且不能取空值*/
                                loction CHAR(10),
                                PRIMARY KEY(Deptno)
                            )
                        (3)用check短语指定列值应该满足的条件
                        【例】Student 表的Ssex只允许取“男”,“女”
                        CREATE table student (
                        Sno CHAR(9) PRIMARY key,   
                        Sname char(20) Not NUll,
                        Ssex char(2) check (Ssex IN(‘男”女’)),
                        Sage CHAR(5),
                        Sdept CHAR(5)
                        );
                        【例】SC的Grade值应该是在0~100之间
                        CREATE table SC (
                        Sno CHAR(9) PRIMARY key,   
                        Cno CHAR(9) PRIMARY key,
                        Grade SMALLINT CHECK(Grade>=0 AND Grade<=100)
                        );
                    5.3.2元组上的约束条件 
                        1.元组上约束条件的定义
                             【例】当学生性别是男,其名字不能以M.s开头
                             Create TABLE Student
                                (Sno char(9),
                                Sname char(8) not null,
                                Ssex char(2),
                                Sage SMALLINT,
                                Sdept char(20),
                                PRIMARY key(Sno),
                                check(Ssex=’女’ OR Sname NOT like ‘Ms.%’)
                                )
                        
            ####5.4完整性的约束命名子句
                1.完整性約束命名子句
                    CONSTRAINT <完整性约束条件名> <完整性约束条件>
                    <完整性约束条件包括>包括 not null、UNIQUE、 PRIMARY KEY、FOREIGN KEY、CHECK短语等
                    【例】建立学生登记表Student 要求学号在90000~999999之间,姓名不能取空值,年龄不能
                    小于30,性别只能是男女

                        CREATE table student(
                            Sno NUMERIC(6) comment
                                CONSTRAINT C1 check(Sno BETWEEN 90000 AND 99999)
                            Sname char(6)
                                CONSTRAINT C2 Not null,
                            Sage NUMERIC(3)
                                CONSTRAINT C3 check(Sage<30)
                            Ssex chear(2)
                                CONSTRAINT c4 CHECK (Ssex IN(‘男’,’女’)),
                                CONSTRAINT studentKey PRIMARY key(Sno)
                
                        )

本文地址:https://blog.csdn.net/qq_38157534/article/details/108974499

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐