表完整性
实体完整性
说明:
关系模型的实体完整性在 CREATE TABLE 中用 PRIMARY KEY 定义
实体完整性是对关系中的记录唯一性,也就是主键的约束。准确地说,实体完整性是指关系中的主属性值不能为Null且不能有相同值。定义表中的所有行能唯一的标识,一般用主键,唯一索引 unique关键字,及identity属性比如说我们的身份证号码,可以唯一标识一个人.
违约处理:
- 插入或对主码列进行更新操作时,RDBMS (关系数据库管理系统)按照实体完整性规则自动进行检查
- 检查主码值是否唯一,如果不唯一则拒绝插入或修改
- 检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改
- 检查记录中主码值是否唯一的一种方法是进行全表扫描,由于对基本表进行全表扫描十分耗时的, RDBMS 核心一般都在主码上自动建立索引
定义:
- 单属性构成的码有两种方法:
- 定义为列级约束条件:
CREATE TABLE Student(Sno CHAR(9) PRIMARY KEY,Sname CHAR(20) NOT NULL, Ssex CHAR(2) ,Sage SMALLINT,Sdept CHAR(20));
- 定义为表级约束条件:
CREATE TABLE Student(Sno CHAR(9), Sname CHAR(20) NOT NULL,Ssex CHAR(2) ,Sage SMALLINT,Sdept CHAR(20),PRIMARY KEY (Sno));
- 定义为列级约束条件:
- 对多个属性构成的码只有一种说明方法:
- 定义为表级约束条件:
参照完整性
定义:
在 CREATE TABLE 中用 FOREIGN KEY 短语定义哪些列为外码用REFERENCES短语指明这些外码参照哪些表的主码
参照完整性是对关系数据库中建立关联关系的数据表间数据参照引用的约束,也就是对外键的约束。准确地说,参照完整性是指关系中的外键必须是另一个关系的主键有效值,或者是NULL。参照完整性维护表间数据的有效性、完整性,通常通过建立外部键联系另一表的主键实现,还可以用触发器来维护参考完整性。
由于在DBMS中,外键会存在影响性能的问题,有经验的开发者和公司,在开发设计阶段,都会建立外键,而交给客户时,会去掉外键关联。去掉外键后,数据由程序来负责参照完整性。
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) /*在表级定义参照完整性*/);
违约处理:
- 拒绝(NO ACTION)执行:不允许该操作执行(默认策略)
- 级联(CASCADE)操作:当删除或修改被参照表的一个组员造成了与参照表的不一致,则删除或修改参照表的所有造成不一致的元组
- 设置为空值(SET-NULL):当删除或修改被参照表的一个组员造成了与参照表的不一致,则将参照表中的所有造成不一致的元组的对应属性设置为空置
说明:
- 对于参照完整性,除了应该定义外码,还应定义外码列是否允许空值
- 可能破坏参照完整性的情况
约束:
任何约束都有约束名
用户定义完整性
说明:
- 用户定义的完整性就是针对某一具体应用的数据必须满足的语义要求,由 RDBMS 提供,而不必由应用程序承担
- 在CREATE TABLE时定义
- 列值非空(NOT NULL)
- 列值唯一(UNIQUE)
- 检查列值是否满足一个布尔表达式(CHECK)
- 设置默认值(DEFAULT)
类别:
- NOT NULL:
- 设置选项值不能为空(不能设置为表属性)
-
CREATE TABLE SC(Sno CHAR(9) NOT NULL, /*Sno属性不允许取空*/ Cno CHAR(4) NOT NULL, /*Cno属性不允许取空*/ Grade SMALLINT NOT NULL, /*Grade属性不允许取空*/ PRIMARY KEY (Sno, Cno), /*在表级定义实体完整性,隐含了Sno,Cno不允 . 许取空值,在列级不允许取空值的定义可不写*/ . .);
- UNIQUE:
- 唯一性约束用于指定一个或者多个列的组合的值具有唯一性,以防止在列中输入重复的值.当使用唯一性约束时,需要考虑以下几个因素:
- 主键自动具有 unique 的特性
- 一个表中可以允许有多个唯一性约束
- 可以把唯一性约束定义在多个字段上
- 唯一性约束用于强制在指定字段上创建一个唯一性索引
- 可以设置为表属性
-
CREATE TABLE DEPT(Deptno NUMERIC(2), Dname CHAR(9) UNIQUE NOT NULL, /*要求Dname列值唯一,且不能取空值*/ Location CHAR(10), PRIMARY KEY (Deptno));
- 唯一性约束用于指定一个或者多个列的组合的值具有唯一性,以防止在列中输入重复的值.当使用唯一性约束时,需要考虑以下几个因素:
- CHECK:
- 用CHECK短语指定列值应该满足的条件:
- 一个列级检查约束只能与限制的字段有关;一个表级检查约束只能与限制的表中字段有关.
- 一个表中可以定义多个检查约束
- 每个 CREATE TABLE 语句中每个字段只能定义一个检查约束
- 在多个字段上定义检查约束,则必须将检查约束定义为表级约束
- 当执行 INSERT 语句或者 UPDATE 语句时,检查约束将验证数据
- 用CHECK短语指定列值应该满足的条件:
CREATE TABLE Student(Sno CHAR(9) PRIMARY KEY,Sname CHAR(20) NOT NULL, Ssex CHAR(2) CHECK(Ssex IN('男','女')), /*性别属性Ssex只允许取'男'或'女'*/Sage SMALLINT,Sdept CHAR(20));
CREATE TABLE SC(Sno CHAR(9) NOT NULL, Cno CHAR(4) NOT NULL, Grade SMALLINT CHECK(Grade>=0 AND Grade <= 100), /*Grade取值范围是0到100*/PRIMARY KEY (Sno, Cno), FOREIGN KEY (Sno) REFERENCES Student(Sno), FOREIGN KEY (Cno) REFERENCES Course(Cno) );
- DEFAULT:
- 定义:
- [constraint 约束名]
- default 常量表达式 for 字段名
- 注意:
- 每个字段只能定义一个缺省约束
- 如果定义的缺省值长于其对应字段的允许长度,那么输入到表中的缺省值将被截断
- 不能加入到带有 IDENTITY 属性的字段上
- 定义:
违约处理:
- 属性上的约束条件检查和违约处理
- 插入元组或修改属性的值时,RDBMS 检查属性上的约束条件是否被满足如果不满足则操作被拒绝执行
- 元组上的约束条件检查和违约处理
- 插入元组或修改属性的值时,RDBMS 检查元组上的约束条件是否被满足如果不满足则操作被拒绝执行
完整性约束命名子句
完整性约束条件除了可以在CREATE TABLE语句中直接定义外,
- 定义约束:
- CONSTRAINT 约束 CONSTRAINT <完整性约束条件名> [ PRIMARY KEY短语 |FOREIGN KEY短语 |CHECK短语 ]
CREATE TABLE Student(Sno CHAR(9) PRIMARY KEY, CONSTRAINT C1 CHECK(Sno BETWEEN 90000 ADN 99999), Sname CHAR(20) CONSTRAINT C2 NOT NULL, Sage SMALLINT CONSTRAINT C3 CHECK(Ssage<30) ,Ssex CHAR(2) CONSTRAINT C4 CHECK(Sex IN('男','女')), CONSTRAINT StudentKey PRIMARY KEY(Sno));
- 删除表完整性约束:
-
ALTER TABLE StudentDROP CONSTRAINT C3;
- 修改表完整性限制:
- 使用 ALTER TABLE 语句修改表中的完整性限制(可以先删除原来的约束条件,再增加新的约束条件)
-
ALTER TABLE StudentDROP CONSTRAINT C3;ALTER TABLE StudentADD CONSTRAINT C3 CHECK (Sage < 40);