《数据库系统概论》知识点总结 第五章 数据库完整性

第五章 数据库完整性

1.数据库的完整性(integrity)是指数据的正确性(correctness)和相容性(compat-ability)。

2.实体完整性

1)定义实体完整性

学生表Student中Sno为码

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

定义SC表中Sno,Cno属性组为码

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

2)实体完整性的检查和违约处理:检查主码值是否唯一,如果不唯一则拒绝插入或者修改;检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改。

3.参照完整性

1)定义参照完整性

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)
);

2)显示说明参照完整性违约处理

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
);

4.用户定义的完整性

1)不能取控制 NOT NULL

2)   列值唯一 UNIQUE

3)用check短语指定列值要满足的条件

CREATE TABLE Student(
    Sno CHAR(9) PRIMARY KEY,
    Cno CHAR(4) NOT NULL,
    Ssex CHAR(2) CHECK(Ssex IN('男','女')),
    Sage SMALLINT,
    Sdept CHAR(20)
);
CREATE TABLE SC(
    Sno CHAR(9),
    Cno CHAR(4),
    Grade SMALLINT CHECK(Grade>=0 AND Grade<=100),
    PRIMARY KEY(Sno,Cno),
    FOREIGN KEY (Sno) REFERENCES Student(Sno),
    FOREIGN KEY (Cno) REFERENCES Course(Cno)
);

4)元组上定义的约束条件

当学生性别是男时,名字不能以Ms.开头

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.完整性约束子句命名

CREATE TABLE Student(
    Sno NUMERIC(6)
        CONSTRAINT C1 CHECK(Sno BETWEEN 90000 AND 99999),
    Sname CHAR(20)
        CONSTRAINT C2 NOT NULL,
    Sage NUMERIC(3)
        CONSTRAINT C3 CHECK(Sage<20),
    Ssex CHAR(2)
        CONSTRAINT C4 CHECK(Ssex IN('男','女')),
        CONSTRAINT StudentKey PRIMARY KEY(Sno)
);

删除原来的约束条件在增加新的约束条件

ALTER TABLE Student
    DROP CONSTRAINT C1;
ALTER TABLE Student
    ADD CONSTRAINT C1 CHECK(Sno BETWEEN 900000 AND 999999);
ALTER TABLE Student
    DROP CONSTRAINT C3;
ALTER TABLE Student
    ADD CONSTRAINT C3 CHECK(Sage<40);

6.断言

断言中CHECK为真是返回假

限制数据库课程最多60名同学选修

CREATE ASSERTION ASSE_SC_DB_NUM
    CHECK(60>=(
        SELECT COUNT(*)
        FROM Course,SC
        WHERE SC.Cno=Course.Cno AND Course.Cname='数据库'
)
);

限制每学期每门课最多60个同学选修

ALTER TABLE SC ADD TERM DATE;
CREATE ASSERTION ASSE_SC_CNUM2
    CHECK(60>=ALL(SELECT COUNT(*) FROM SC GROUP BY Cno,TERM));

7.触发器:满足一定条件就会执行的程序段

定义一个触发器,一旦更新的成绩超过10%就记录到另外一张表

CREATE TRIGGER SC_T
AFTER UPDATE OF Grade ON SC
REFERENCING
    OLDROW AS oldTuple
    NEWROW AS newYuple
FOR EACH ROW
WHEN(newTuple.Grade>=1.1*oldTuple.Grade)
    INSERT INTO SC_U(Sno,Cno,OldGrade,NewGrade)
    VALUES(oldTuple.Sno,oldTuple.Cno,oldTuple.Grade,newTuple.Grade);

将每次对表Student的插入操作都记录到表StudentInsertLog中去

CREATE TRIGGER Student_Count
AFTER INSERT ON Student
REFERENCING
    NEW TABLE AS DELTA
FOR EACH STATEMENT
    INSERT INTO StudentInsertLog(Numbers)
    SELECT COUNT(*) FROM DELTA

这里使用了语句级触发器,没执行完一个语句才触发一次

定义一个触发器,如果教授工资少于4000,则把工资变为4000

CREATE TRIGGER Insert_Or_Update_Sal
BEFORE INSERT OR UPDATE ON Teacher
REFERENCING NEW row AS newTuple
FOR EACH ROW
BEGIN
    IF(newTuple.Job='教授')AND(newTuple.sal<4000)
        THEN newTuple.sal=4000;
    END IF;
END;

同一个表上有多个触发器时的执行顺序:BEFROE触发器-->sql语句-->AFTER触发器

猜你喜欢

转载自blog.csdn.net/haohulala/article/details/82696665