数据库第五章总结!

本文深入探讨了数据库完整性的概念,包括实体完整性、参照完整性和用户定义的完整性,详细讲解了如何在SQL中定义这些完整性约束,以及如何通过断言、触发器等机制来维护数据的一致性和正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第五章 数据库完整性

 

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触发器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值