文章目录
- 引言
- 5.1 实体完整性
- 5.2 参照完整性
- 5.3 用户定义的完整性
- 5.4 完整性约束命名子句
- 5.6 触发器
引言
- 数据库的完整性是指数据的
正确性
和相容性
。
正确性:符合现实语义、反映当前实际情况。性别必须为男或女。
相容性:数据库同一对象在不同关系表中的数据是符合逻辑的。学生所在院系必须是已成立的。 - 数据库完整性和安全性的区别
完整性防止数据库中存在不符合语义的数据;安全性防止数据库被恶意破坏和非法存取。 - 为了维护完整性,DBMS必须实现如下功能
1.提供定义完整性约束的机制
2. 提供完整性检查的方法
3. 进行违约处理
5.1 实体完整性
- 定义方法
create table student(sno char(9) primary key, // 在列级定义主码...
);
create table student(sno char(9) ...primary key(sno) // 在表级定义主码
);
create table sc(sno char(9) cno char(10)...primary key(sno,cno) // 多属性主码只能在表级定义主码
);
// 非创建表时创建主码
alter table student
add constraint PK_STU
primary key clustered (sno asc)
- 完整性检查
时机:执行insert,或对主码列update时
方法:全表扫描,一一检查;可建立索引减少时间 - 违约处理
(1)主码值是否唯一,不唯一则拒绝insert或update
(2)主码的各个属性是否为NULL,有一个为空就拒绝insert或update
5.2 参照完整性
- 定义
Foreign key(cno) references course(cno)
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)
/*表级定义参照完整性*/
);
- 完整性检查
- 违约处理
on delete/update 是对被参照表的属性说明的,也就是主键表(被参照表)的主键列值更新后如何影响外键表的对应记录。
特别的:NO ACTION是指如果外键表存在对应记录,主键表不能执行动作。
5.3 用户定义的完整性
-
定义
(1)属性上的约束(列级)// not null CREATE TABLE SC (Sno CHAR(9) NOT NULL, Cno CHAR(4) NOT NULL, Grade SMALLINT NOT NULL, PRIMARY KEY (Sno, Cno); // unique + not null CREATE TABLE DEPT (Deptno NUMERIC(2), Dname CHAR(9) UNIQUE NOT NULL, Location CHAR(10), PRIMARY KEY (Deptno) ); // check CREATE TABLE Student (Sno CHAR(9) PRIMARY KEY, Sname CHAR(8) NOT NULL, Ssex CHAR(2) CHECK (Ssex IN ('男',女’) ) , /*性别属性Ssex只允许取'男'或'女' */ Sage SMALLINT, Sdept CHAR(20) );
(2)元组上的约束
元组级的限制(表级约束)可以设置不同属性之间的取值的相互约束条件CREATE TABLE Student (Sno CHAR(9), Sname CHAR(8) NOT NULL, Ssex CHAR(2), Sage SMALLINT, Sdept CHAR(20) default 18, // 列默认 PRIMARY KEY (Sno), CHECK (Ssex='女' OR Sname NOT LIKE 'Ms.%') /*定义了元组中Sname和 Ssex两个属性值之间的约束条件*/ );
-
检查时机
INSERT元组或UPDATE属性值时,
RDBMS自动检查 -
违约处理
不满足则拒绝执行
5.4 完整性约束命名子句
给约束命名之后,方便删除等
-
命名约束
-
修改约束
alter table student add constraint df_sex default ('男') for sex
5.6 触发器
- 格式
- 两个内置临时表,很关键
注意书上代码和实际数据库软件的实现不一样。