数据库完整性----约束

来源:互联网 发布:ping不通阿里云服务器 编辑:程序博客网 时间:2024/06/10 21:53

数据的完整性包括数据的正确性和相容性

完整性与安全性间的比较

数据的完整性

防止数据库中存在不符合语义的数据,也就是防止数据库中存在不正常的数据
防范对象:不合语意的、不正确的数据

数据的安全性

保护数据库防止恶意的破坏和非法的存取
防范对象:非法用户和非法操作

为维护数据库的完整性,DBMS必须满足以下条件

  • 提供定义完整性约束条件的机制
  • 提供完整性检查的方法
  • 违约处理

实体的完整性

实体完整性的定义

create table 中用primary key定义

create table student(Sno char(9) primary key,Sname char(20) not null,······);//在列级定义主码
create table student(Sno char(9) ,Sname char(20) not null,······primary key(Sno,Sname));//在表级定义主码//属性组只能在表级定义主码

修改数据表时添加主键约束

alter table studentadd constraint P1 primary key(Sno)//add constraint 约束名 primary key(列名)

实体完整性检查和违约处理

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

参照完整性

参照完整性定义

在create table 中用foreign key短语定义哪些列为外码
用references短语指明这些外码参照哪些表的主码

create table sc(    Sno char(9) not null,    Cno char(9) not null,    Grade int,    primary key(Sno,Cno),    //在表级定义主码    foreign key(Sno) references Student(Sno),    foreign key(Cno) references Course(Cno)    //在表级定义参照完整性);

在修改表时添加外键约束

alter table scadd constraint F1 foreign key(Sno) references student(Sno)

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

create table sc(    Sno char(9) not null,    Cno char(9) not null,    Grade int,    primary key(Sno,Cno),    //在表级定义主码    foreign key(Sno) references Student(Sno),    on delete cascade    //级联删除sc表中相应元组    on update casxade    //级联更新sc表中相应元组    foreign key(Cno) references Course(Cno),    on delete no action    //当删除course表中元组造成与sc中不一致时拒绝删除    on update cascade    //当更新course表中的cno时,级联更新sc表中相应的元组);

用户参照的完整性

属性上的约束条件

created table时定义
+ 列值非空(not null )
+ 列值唯一(unique)
+ 满足一个布尔表达式(check)
+ 默认值约束(default)

修改表时添加或删除not null约束

alter table 表名alter column 列名 null | not null

修改表时添加唯一约束

alter table 表名add constraint 约束名 unique(列名)

修改表时添加check约束

alter table 表名add constraint 约束名 check(逻辑表达式)
alter table studentadd constraint c1 check(Ssex in ('男','女'))

修改表时添加默认值约束

alter table 表名add constraint 约束名 default 默认值 for 列名
alter table student add constraint c2 default '男' for Ssex

元组上的约束条件

在 created table时使用check短语定义元组上的约束条件,即元组级的限制

create table student(    Sno char(9) not null,    Ssex char(2),    check(Ssex='女' or Sname not like 'Ms.%'));//当学生性别为男时,其名字不能以Ms.开头

完整性约束命名子句

用来对完整性约束条件命名,从而可以灵活的增加、删除一个完整性约束条件
constraint<约束名><约束条件>

create table stable(    Sno char(9),    constraint C1 check(Sno between 9000 and 9999),    Sname char(20),    constraint C2 not null,    Sage int,    constraint C3 check(Sage<30),    Ssex char(2),    constraint C4 check(Ssex in('男','女'),    constraint Stadentkey primary key(Sno)    //建立学生登记表Student,要求学号在9000~9999之间,姓名不能取空值,年龄小于30,性别只能是“男”或“女”    //在Student表上建立了5个约束条件,包括主码约束(命名为StudentKey)以及C1、C2、C3、C4四个列级约束);
1 0