数据的完整性,是不能直接从字面上理解的,先看定义:
数据的完整性是为了防止数据库中存在不符合语义的数据,也就是为了防止数据库中存在不正确的数据。
因此,完整性检查和控制的防范对象是不合语义的、不正确的数据,防止它们进入数据库——即给数据定个框框,做各种限制,使符合您的需求。
下面这些语句您一定很熟悉:
create table XX(
xx1 int not null auto_increment unsigned,
xx2 varchar(255) not null unique,
xx3 varchar(255) unique,
xx5 tinyint(1) not null unsigned,
primary key(user_id),
foreign key (xx5) references YY(yy1)
)
一看就头晕,也容易忘,什么主键、外键、非空、唯一,现在dandelion告诉您,用”数据库完整性”来记,刚刚好。因为这些放在列名和数据类型后面的,就是用来限制数据范围的,也就是为数据库完整性服务的。
照例先看结论。
一.要点提炼
数据库完整性
- 实体完整体 primary key
- 参照完整性 foreign key
- 用户定义的完整性 check
- 属性上的完整性
- not null
- unique
- check
- 元组上的完整性
- check
- 其他
- 默认值 default 20
- 自增 auto_increment
- 无符号 unsigned
- 属性上的完整性
二.建表语句
[科普基础知识时间]
建表的基本语句:
CREATE TABLE<表名>(
列名 数据类型 [列级完整性约束条件]
[,列名 数据类型 [列级完整性约束条件]……]
[,表级完整性约束条件]
)
需要了解的两个概念:列级完整性约束条件,表级完整性约束条件。
所涉及的就是我们之前提到的那些内容。
- 列级完整性约束条件:只应用到一个列的完整性约束条件。
- 表级完整性约束条件:应用到多个列的完整性约束条件。(比如上面提到的例子,如果外键有两个,那么一定要定义在下面,作为表级完整性约束条件)
三.实体完整性、参照完整性、用户定义的完整性
数据库完整性包括:实体完整性、参照完整性、用户定义的完整性。
简单来说,就是 实体完整性(主键),参照完整性(外键),用户定义的完整性(非空、唯一,check范围等……)
数据库完整性 | 记忆 | 形 | 例子 |
---|---|---|---|
实体完整性 | 主键 | primary key(列[,列]) | PRIMARY KEY(Sno,Cno) |
列名 数据类型 primary key | Sno CHAR(9) PRIMARY KEY | ||
参照完整性 | 外键 | foreign key(列名) references 被参照表名(列名) | FOREIGN KEY(Sno) REFERENCES Student(Sno) |
用户定义的完整性 | 非空 | 列名 数据类型 not null | Sno CHAR(9) NOT NULL |
唯一 | 列名 数据类型 unique | Sno CHAR(9) UNIQUE | |
check范围 | 列名 数据类型 check() | Ssex CHAR(9) CHECK(Ssex IN('男','女')) | |
check() | CHECK(Ssex='女' OR Sname NOT LIKE 'MS.%') | ||
其他 | 默认值 | 列名 数据类型 default 默认值 | Snum INT(11) DEFAULT 20 |
自增 | 列名 数据类型 auto_increment | Snum INT(11) AUTO_INCREMENT | |
无符号 | 列名 数据类型 unsigned | Snum INT(11) UNSIGNED |
注:实体完整性和参照完整性是关系模型必须满足的完整性约束条件,被称作关系的两个不变性,应该由关系系统自动支持。用户定义的完整性是应用领域需要遵循的约束条件。
这种3+1的记法应该挺好记的吧,再加一点:
主键:唯一,不能为空;
外键:要么取空值,要么等于被参照表中某个元组的主码值。(违约处理方式:拒绝/级联删除/设置为控制)
参考文献:
数据库系统概论(第四版)王珊 萨师煊