Alex_McAvoy

想要成为渔夫的猎手

SQL 实体完整性

【实体完整性定义】

在 SQL 中,关系模型的实体完整性在 CREATE TABLE 语句中用 PRIMARY KEY 短语来定义

对于单属性构成的码,既可以定义为列级约束条件,又可以定义为表级约束条件

例如,将 student 表中的 Sno 属性定义为码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/*列级定义主码*/
CREATE TABLE student (
Sno CHAR(9) PRIMARY KEY,
Sname CHAR(20) NOT NULL,
Ssex CHAR(2),
Sage SMALLINT(6),
Sdept CHAR(20)
);

/*表级定义主码*/
CREATE TABLE student (
Sno CHAR(9),
Sname CHAR(20) NOT NULL,
Sse` CHAR(2),
Sage SMALLINT(6),
Sdept CHAR(20),
PRIMARY KEY(Sno)
);

对于多属性构成的码,只能定义为表级约束条件

例如,将 sc 表中的 Sno、Cno 属性定义为码

1
2
3
4
5
6
CREATE TABLE sc (
Sno CHAR(9) NOT NULL,
Cno CHAR(4) NOT NULL,
Grade SMALLINT,
PRIMARY KEY(Sno, Cno)
);

【实体完整性检查与违约处理】

PRIMARY KEY 短语定义了关系的主码后,每当用户程序对基本表插入一条记录或对主码列进行更新时,RDBMS 会按照实体完整性规则进行检查,包括:

  • 检查主码值是否唯一:如果不唯一则拒绝插入或修改
  • 检查主码的各个属性是否为空:只要有一个为空就拒绝插入或修改

检查记录中主码值是否唯一的一种方法是进行全表扫描,依次判断表中每一条记录的主码值与插入或修改的新主码值是否相同

但全表扫描是极其耗时的,为避免对基本表进行扫描,RDBMS 一般都在主码上自动建立一个索引,通过索引查找基本表中是否已存在新主码值,目前,最常用的索引是 B+ 树索引

感谢您对我的支持,让我继续努力分享有用的技术与知识点!