【数据库】第五章 数据库的完整性(2020.4.15)联系第三章

实体完整性 主属性非空

检查主码值是否唯一 :检查方法-进行全表扫描,为避免全表扫描,一般会在主码上建立索引
检查主码的各个属性是否为空

例子
1.在Student表中Sno定义为码
(1)在列表中定义
(2)在表级定义
2.将SC表中的Sno,Cno属性组定义为码

参照完整性

外码的约束:只能是空值或者是被参照表中的主码中的值
显示说明参数完整性的违约处理示例
设置策略时,注意不雅违背实体完整性(SET-NULL的时候)

create table ssc   /*这组语句未执行*/
(
 Sno char(9) not null,
 Cno char(4) not null,
 Grade smallint,
 primary key (Sno,Cno),/*当有这句话时,前面两个not null的约束是多余的*/
 foreign key (Sno) references Student(Sno)
	on delete cascade /*级联删除ssc表中相应的元组*/
	on update cascade, /*级联更新ssc表中相应的元组*/
 foreign key (Cno) references Course(Cno)
	on delete no action
	/*当删除course表中的元组造成了与ssc表中不一致时拒绝删除*/
	on update cascade
	/*当更新course表中的cno时,级联更新ssc表中相应的元组*/
);
用户自定义完整性

1.不允许空值
2.列表值的唯一性约束(unique,同时也限定了非空)
3.用check短语指定列值应该满足的条件

例子

1.Sstudent表的ssex只取“男”或“女”

create table Sstudent/*这组语句未执行*/
(
 Sno char(9) primary key,
 Sname char(8) not null,
 Ssex char(2) check(Ssex in ('男','女')),/*性别属性Ssex只允许取 男 或者 女*/
 Sage smallint,
 Sdept char(20),
);

2.sSC表的Grade的值应该在0和100之间

CREATE TABLE sSC /*这组语句未执行*/
    (Sno  CHAR(9)  NOT NULL,
     Cno CHAR(4)  NOT NULL,                     
     Grade  SMALLINT CHECK(Grade >=0 AND Grade <=100),
     PRIMARY KEY(Sno, Cno),
     FOREIGN (Sno) REFERENCES Student(Sno),
     FOREIGN (Cno) REFERENCES Course(Cno)
  );

3.当学生的性别是男时,其名字不能以Ms.打头。

CREATE TABLE Sstudent /*这组语句未执行*/
(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.%')
 /*定义了元组中Sname和 Ssex两个属性值之间的约束条件*/
);
/*性别是女性的元组都能通过该项检查,因为Ssex=‘女’成立;
当性别是男性时,要通过检查则名字一定不能以Ms.打头*/
完整性约束子句

4.建立学生登记表Student,要求学号在90000~99999之间,姓名不能取空值,年龄小于30,性别只能是“男”或“女”

CREATE TABLE Student /*这组语句未执行*/
(Sno  NUMERIC(6)
 CONSTRAINT C1 CHECK (Sno BETWEEN 90000 AND 99999),/*学号在 90000~99999*/
 Sname  CHAR(20)  
 CONSTRAINT C2 NOT NULL,  /*姓名不能取空值*/
 Sage  NUMERIC(3)
 CONSTRAINT C3 CHECK (Sage < 30), /*年龄小于30*/
 Ssex  CHAR(2)
 CONSTRAINT C4 CHECK (Ssex IN ( '男','女')),/*性别只能取 男 或 女*/
 CONSTRAINT StudentKey PRIMARY KEY(Sno) /*隐藏约束 主码指定*/
);
/*在Student表上建立了5个约束条件,包括主码约束(命名为StudentKey)
以及C1、C2、C3、C4四个列级约束。*/

5.建立教师表Teacher,要求每个教师的应发工资 不低于3000元。(应发工资等于实发工资Sal和扣除项Deduct之和)

CREATE TABLE TEACHER
(Eno  NUMERIC(4) PRIMARY KEY,
 Ename  CHAR(10),          
 Job  char(8),
 Sal NUMERIC(7,2),
 Deduct NUMERIC(7,2),
 Deptno  NUMERIC(7,2),
 CONSTRAINT EMPFKEY FOREIGN KEY (Deptno) REFERENCES DEPT(Deptno),
 CONSTRAINT C1 CHECK(Sal + Deduct >= 3000)
);
/*在Teacher表上建立了外键约束*/
使用ALTER TABLE语句修改表中的完整性限制 /* 第三章语法 */

6.修改表Student中的约束条件,要求学号改为在900000~999999之间,年龄由小于30改为小于40

/*先删除原来的约束条件,再增加新的约束条件*/
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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值