数据完整性

来源:互联网 发布:书剑恩仇录 知乎 编辑:程序博客网 时间:2024/05/17 07:43

实体完整性定义:

关系模型的实体完整性在CREATE TABLE中用PRIMARY KEY定义。对单属性构成的码可以定义为列级约束条件,也可以定义为表级约束条件,对多属性构成的码只能定义为表级约束条件。


实体完整性检查:

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

2、检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改

检查主码唯一可以进行全表扫描,但十分耗时,RDBMS核心一般都在主码上建立一个索引,如B+树索引,以提高效率。


参照完整性定义:

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


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

对被参照表和参照表进行增删改查操作时有可能破坏参照完整性,必须进行检查。

1、拒绝执行

系统默认执行策略,不允许该操作执行

2、级联操作

当删除或修改被参照表的一个元组造成了与参照表不一致,则删除或修改参照表中所有造成不一致的元祖

3、设置为空值

当删除或修改被参照表的一个元组造成了与参照表不一致,则将参照表中所有造成不一致的元祖的对应属性设置为空值,前提是该外码可以为空值。

如想让系统采用2、3策略必须在创建表时显式的加以说明。


CREATE TABLE SC    (Sno CHAR(9) NOT NULL,     Cno CHAR(4) NOT NULL,     Grede SMALLINT CHECK(Grade>=0 AND Grade <=100),     PRIMARY KEY (Sno,Cno),     FOREIGN KEY(Sno)REFERENCES Student(Sno)ON DELETE CASCADEON UPDATE CASCADE,     FOREIGN KEY(Cno)REFERENCES Course(Cno)ON DELETE NO ACTIONON UPDATE CASCADE);

用户完整性定义:

属性上约束条件定义:

1、列值非空(NOT NULL)

2、列值唯一(UNIQUE)

3、检查列值是否满足一个布尔表达式(CHECK)


完整性约束命名子句

CONSTRAINT <完整性约束条件名> [PRIMARY KEY短语|FOREIGN KEY短语|CHECK短语]

CREATE TEBLE 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<30 AND Sage>0),Ssex CHAR(2)CONSTRAINT C4 CHECK(Ssex IN ('男','女')),CONSTRAINT StudentKey PRIMARY KEY(Sno));
C1、C2、C3、C4为四个列级约束,StudentKey为主码约束


修改表中完整性限制:

ALTER TEBLE StudentDROP CONSTRAINT C1;ALTER TABLE StudentADD CONSTRAINT C1 CHECK(Sno BETWEEN 900 AND 999);

域中的完整性限制:

CREATE DOMAIN GenderDomain CHAR(2)CONSTRAINT GD CHECK(VALUE IN ('男','女'));ALTER DOMAIN GenderDomainDROP CONSTRAINT GD;ALTER DOMAIN GenderDomainADD CONSTRAINT GDD CHECK(VALUE IN('1','0'));


定义触发器

CREATE TRIGGER <触发器名>

{BEFORE | AFTER } <触发事件> ON <表名>

FOR EACH { ROW | STATEMENT }

[WHEN <触发条件>]

<触发动作体>

删除触发器:

DROP TRIGGER <触发器名> ON <表名>;

触发器执行顺序:

1、执行该表上的BEFORE触发器

2、执行触发器的SQL语句

3、执行该表上的AFTER触发器

对于同一表上的多个BEFORE(AFTER)触发器,按照定义的先后顺序执行(有些RDBMS按照触发器名称的字母排序顺序执行触发器)



-----------------------

摘自《数据库系统概论》,王珊、萨师煊


0 0