实体完整性 主属性非空
检查主码值是否唯一 :检查方法-进行全表扫描,为避免全表扫描,一般会在主码上建立索引
检查主码的各个属性是否为空
例子
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);