SQL 用户定义的完整性

本文最后更新于:2024年3月18日 凌晨

SQL 用户定义的完整性

  • 用户定义的完整性就是针对某一具体应用的数据必须满足的语义要求,目前的关系数据库管理系统都提供了定义和检验这类完整性的机制,使用了和实体完整性,参照完整性相同的技术和方法来处理它们,而不必由应用程序承担这一功能。

属性上的约束条件

属性上的约束条件的定义

在CREATE TABLE中定义属性的同时,可以根据应用要求定义属性上的约束条件,即属性值限制,包括:

  • 列值非空(NOT NULL)
  • 列值唯一(UNIQUE)
  • 检查列值是否满足一个条件表达式(CHECK短语)

不允许取空值

[例5.5]:在定义SC表时,说明Sno,Cno,Grade属性不允许取空值。

1
2
3
4
5
6
7
8
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不允许取空值,在。
列级不允许取空值的定义可不写*/
);

列值唯一

[例5.6]:建立部门表DEPT,要求部门名称Dname列取值唯一,部门编号Deptno列为主码。

1
2
3
4
5
6
CREATE TABLE DEPT(
Deptno NUMERIC(2),
Dname CHAR(9) UNIQUE NOT NULL ,/*要求Dname列值唯一,且不能取空值*/
Location CHAR(10),
PRIMARY KEY (Deptno)
);

用CHECK短语指定列值应该满足的条件

[例5.7]:Student表的Ssex只允许取"男’或"女’

1
2
3
4
5
6
7
8
CREATE TABLE Student
(
Sno CHAR(9) PRIMARY KEY ,/*在列级定义主码*/
Sname CHAR(9) NOT NULL,/*Sname属性不允许取空值*/
Ssex CHAR(2) CHECK (Ssex IN ('男','女')),/*性别属性Ssex只允许取男或女*/
Sage SMALLINT,
Sdept CHAR(20)
);

[例5.8]:SC表的Grade的值应该在0和100之间。

1
2
3
4
5
6
7
8
9
CREATE TABLE SC
(
Sno CHAR(9),
Cno CHAR(4),
Grade SMALLINT CHECK (Grade>=0 AND Grade<=100),/*Grade取值范围是0到100*/
PRIMARY KEY (Sno,Cno),
FOREIGN KEY (Sno) REFERENCES [S-T].Student(Sno),
FOREIGN KEY (Cno) REFERENCES [S-T].Course(Cnso),
);

属性上约束条件的检查和违约条件

  • 当往表中插入元组或修改属性的值时,关系数据库管理系统将检查属性上的约束条件是否被满足,如果不满足则操作被拒绝执行。

元组上的约束条件

元组上约束条件的定义

  • 与属性上约束条件的定义类似,在CREATE TABLE语句中可以用CHECK短语定义元组上的约束条件,即元组级的限制,同属性值限制相比,元组级的限制可以设置不同属性之间的取值相互约束条件。

[例5.9]:当学生的性别是男时,其名字不能以Ms.开头。

1
2
3
4
5
6
7
8
9
10
CREATE TABLE  Student
(
Sno CHAR(9),
Sname CHAR(8) NOT NULL ,
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20),
PRIMARY KEY (Sno),
CHECK (Ssex='女' OR Sname NOT LIKE 'Ms.%')
);/*定义了元组中Sname和Ssex两个属性值之间的约束条件*/
  • 性别是女性的元组都能通过该项CHECK检查,因为Ssex='女"成立,当性别是男性时,要通过检查则名字一定不能以Ms.开头,因为Ssex='男"时,条件要想为真值,Sname NOT LIKE 'Ms.%'必须为真值。

元组上约束条件的检查和违约处理

当往表中插入元组或修改属性的值时,关系数据库管理系统将检查元组上的约束条件是否被满足,如果不满足则操作被拒绝执行。