数据库完整性约束

原创


数据库完整性约束分为三种:实体完整性约束、参照完整性约束、用户定义的完整性

实体完整性

规则:若属性(指一个或一组属性)A是基本关系R的主属性,则A不能取空值。所谓空值

就是”不知道“或”不存在“或”无意义“的值。

意思十分明显,就是关系中的主码是不能取空值的

参照完整性

定义:设F施基本关系R的一个或一组属性,但不是关系R的码,KS是基本关系S的主码。

如果F与KS相对应,则称F是R的外码,并称基本关系R为参照关系,基本关系S为被参照

关系或目标关系。

规则:若属性(或属性组)F是基本关系R的外码,它与基本关系S的主码KS相对应,则对于

R中每个元组在F上的值必须:

  • 或者取空值
  • 或者等于S中某个元祖的主码值

用户定义的完整性

任何关系数据库系统都应该支持实体完整性和参照完整性。除此之外,不同的关系数据库系统根据

其应用环境的不同,往往还需要一些特殊的约束条件。用户定义的完整性就是针对某一具体关系数

据库的约束条件,它反映某一具体应用所涉及的数据必须满足的语义要求。


定义实体完整性

关系模型的实体完整性在CREATE TABLE中用PRIMARY KEY定义。对单属性构成的码有两种说明方法,

一种是定义为列级约束条件,另一种是定义为表级约束条件。对多个属性构成的码只有一种说明方法,即

定义为表级约束条件。

/*建立Student表*/
create table Student(
    sno char(9) primary key,    //在列级定义主码
    sname char(20) not null,
    ssex char(2),
    sage smallint,
    sdept char(20)
);
/*建立Course表*/
create table Course(
    cno char(9),
    cname char(20)
    primary key(cno)    //在表级定义主码
)

实体完整性检查:

  • 检查主码值是否唯一,如果不唯一则拒绝插入或修改。
  • 检查主码的各个属性是否为空,只有有一个为空就拒绝插入或修改。

定义参照完整性

关系模型的参照完整性在CREATE TABLE中用FOREIGN KEY短语定义哪些列为外码,用

REFERENCES短语指明这些外码参照哪些表的主码。

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

参照完整性违约处理

  • 拒绝(NO ACTION)执行(系统默认)
  • 级联(CASCADE)操作
  • 设置为空值
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    //级联删除
        ON UPDATE CASCADE,    //级联更新
    foreign key(cno) references Course(cno),    //在表级定义参数完整性
        ON DELETE NO ACTION    //拒绝删除
        ON UPDATE CASCADE    //级联更新
);

用户定义的完整性

  • 属性上的约束条件(列值非空(NO NULL)、列值唯一(UNIQUE)、检查列值是否满足一个条件表达式(CHECK短语))。
ssex char(2) check(ssex in('','')),
  • 元组上的约束条件
create table Student(
    sno char(9) primary key,    //在列级定义主码
    sname char(20) not null,
    ssex char(2)
    sage smallint,
    sdept char(20)
    check(ssex='' or sname not like'Ms.%')
);

10:50:01

2018-12-06

posted @ 2018-12-06 10:47  一转身已万水千山  阅读(1109)  评论(0编辑  收藏  举报