> For the complete documentation index, see [llms.txt](https://hiki-nazimis-organization.gitbook.io/database6th/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hiki-nazimis-organization.gitbook.io/database6th/di-wu-zhang.md).

# 第五章

### 1 . 什么是数据库的完整性？

数据库的完整性是指数据的正确性和相容性。

### 2 ．数据库的完整性概念与数据库的安全性概念有什么区别和联系？

数据的完整性和安全性是两个不同的概念，但是有一定的联系。

前者是为了防止数据库中存在不符合语义的数据，防止错误信息的输入和输出，即所谓垃圾进垃圾出（ Garbage In Garbage out ）所造成的无效操作和错误结果。

后者是保护数据库防止恶意的破坏和非法的存取。也就是说，安全性措施的防范对象是非法用户和非法操作，完整性措施的防范对象是不合语义的数据。

### 3 ．什么是数据库的完整性约束？

完整性约束条件是指数据库中的数据应该满足的语义约束条件。

### 4 ．数据库管理系统的完整性控制机制应具备哪三方面的功能？

1. 提供定义完整性约束条件的机制；&#x20;
2. 提供检查完整性约束的方法
3. 提供完整性的违约处理方法

### 5 ．数据库管理系统在实现参照完整性时需要考虑哪些方面？

书本第155面的表格

1. 当参照表插入元组时,可能破坏被参照表的完整性
2. 当参照表修改外码值时,可能破坏被参照表的完整性
3. 当被参照表删除元组时,可能破坏参照表的完整性
4. 当被参照表修改主码值时,可能破坏参照表的完整性

以及用户违约后的处理

### 6 ．假设有下面两个关系模式：

职工（职工号，姓名，出生日期，职务，工资，部门号），其中职工号为主码；

部门（部门号，名称，经理姓名，电话），其中部门号为主码。

用 SQL 语言定义这两个关系模式，要求在模式中完成以下完整性约束条件的定义：

1. 定义每个模式的主码
2. 定义参照完整性约束
3. 定义职工年龄不超过 65岁

```sql
/*职工（职工号，姓名，出生日期，职务，工资，部门号）*/
CREATE TABLE EMP
(Empno NUMBER(4) PRIMARY KEY,
Ename VARCHAR(10),
Birthday data,
CONSTRAINT C1 CHECK ( FLOOR(DATEDIFF(CURDATE(), Birthday) / 365) <=65),
#CURDATE()求当前时间,DATEDIFF()时间相减,返回天数
Job VARCHAR(9),
Sal NUMBER(7,2),
Deptno NUMBER(2),
CONSTRAINT FK_DEPTNO FOREIGN KEY(Deptno) REFERENCES DEPT(Deptno));

/*部门（部门号，名称，经理姓名，电话）*/
CREATE TABLE DEPT
(Deptno NUMBER(2) PRIMARY KEY,
Deptname VARCHAR(10),
Manager VARCHAR(10),
PhoneNumber Char(12)
```

### 7 ．在关系数据库管理系统中，当操作违反实体完整性、参照完整性和用户定义的完整性约束条件时，一般是如何分别进行处理的

对于违反实体完整性和用户定义的完整性的操作一般都采用拒绝执行的方式进行处理。

而对于违反参照完整性的操作，并不都是简单地拒绝执行，有时要根据应用语义执行一些附加的操作，以保证数据库的正确性。

### 8．某单位想举行一个小型联谊会,关系 Male 记录注册的男宾信息 ,关系 Female 记录 注册的女宾信息。建立一个断言 ,将来宾的人数限制在 50 人以内(提示 ,先创建关系 Female 和关系 Male) 。

```sql

CREATE TABLE Male                                      
(SerialNumber SmallInt PRIMARY KEY，                
Name Char(8) ，,
Age SmallInt ,
Occupation Char(20)
);

CREATE TABLE Female                                     
(SerialNumber SmallInt PRIMARY KEY ，                   ，
Name Char(8) ，
Age SmalllInt ,
Occupation Char( 20)
) ;

CREATE SSERTION Party                      /*# 创建断言 PARTY * /
CHECK((SELECT COUNT(*) FROM Male+(SELECT COUNT(*) FROM Female))<=50);

```
