任务描述
本关任务:定义教师表的完整性。
相关知识
为了完成本关任务,你需要掌握:1.用户定义的完整性,2.属性上的约束条件,3.元组上的约束条件。
用户定义的完整性
任何关系数据库系统都应该支持实体完整性和参照完整性,这是关系模型所要求的。除此之外,不同的关系数据库系统根据其应用环境的不同,往往还需要一些特殊的约束条件。
用户定义的完整性就是针对某一具体关系数据库的约束条件,它反映某一具体应用所涉及的数据必须满足的语义要求。力图某个属性必须取唯一值、某个非主属性不能取空值等。
属性上的约束条件
属性上约束条件的定义
在 CREATE TABLE 中定义属性的同时,可以根据应用要求定义属性上的约束条件,即属性值限制,包括:
-
列值非空(NOT NULL)
-
列值唯一(UNIQUE)
-
检查列值是否满足一个条件表达式(CHECK短语)
例如在定义 SC 表时,说明 Sno、Cno、Grade 属性不允许取空值:
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不允许取空值,在列级不允许取空值的定义可不写*/
);
例如建立部门表 DEPT 要求部门名称 Dname 列取值唯一,部门编号 Deptno 列为主码:
CREATE TABLE DEPT(
Deptno NUMERIC(2),
Dname CHAR(9) UNIQUE NOT NULL, /*要求Dname列值唯一,且不能取空值*/
Location CHAR(10),
PRIMARY KEY(Deptno)
);
例如创建 Student 表的Ssex 只允许取“男”或“女”:
CREATE TABLE Student(
Sno CHAR(9) PRIMARY KEY, /*在列级定义主码*/
Sname CHAR(8) NOT NULL, /*Sname属性不允许取空值*/
Ssex CHAR(2) CHECK(Ssex IN('男','女')), /*性别属性Ssex只允许取‘男’或‘女’*/
Sage INT
);
属性上约束条件的检查和违约处理
当往表中插入元组或修改属性的值时,关系数据库管理系统将检查属性上的约束条件是否被满足,如果不满足则操作被拒绝执行。
元组上的约束条件
元组上约束条件的定义
与属性上约束条件的定义类似,在 CREATE TABLE 语句中可以用 CHECK 短语定义原子上的约束条件,即元组级的限制。同属性值限制相比,元组级的限制可以设置不同属性之间的取值的相互约束条件。
例如在创建 Student 表时当学生的性别是男时,其名字不能以Ms.
开头:
CREATE TABLE Student(
Sno CHAR(9),
Sname CHAR(20) NOT NULL,
Ssex CHAR(2),
Sage INT,
CHECK(Ssex='女' OR Sname NOT LIKE 'Ms.%') /*定义了元组中Sname和Ssex两个属性值之间的约束条件*/
);
性别是女性的元组都能通过该项 CHECK 检查,因为Ssex='女'
成立;当性别是男性时,要通过检查则名字一定不能以Ms.
开头,因为Ssex='男'
时,条件要想为真值,Sname NOT LIKE 'Ms.%'
必须为真值。
元组上约束条件的检查和违约处理
当往表中插入元组或修改属性的值时,关系数据库管理系统将检查元组上的约束条件是否被满足,如果不满足则操作被拒绝执行。
编程要求
在右侧编辑器补充代码,在右侧编辑器Begin-End
处补充代码,定义教师表(teacher)的完整性,要求教师名称 Tname 列取值唯一,教师表结构及插入信息如下:
教师表结构:
字段名称 | 类型 | 备注 |
---|---|---|
Tno | char(5) | 编号 |
Tname | char(8) | 姓名 |
Tsex | char(1) | 性别 |
Tage | int | 年龄 |
Tdept | char(20) | 所属部门 |
教师表插入信息如下:
Tno | Tname | Tsex | Tage | Tdept |
---|---|---|---|---|
T02 | 王勇 | M | 38 | 后勤部 |
T03 | 王勇 | M | 20 | 研发部 |
观察发现我们插入数据的 Tname 属性值是两个重复的人名也就不唯一了,与我们要求的唯一性相违背,因此系统会提示错误信息:
Duplicate entry '王勇' for key 'Tname'
测试说明
平台会对你编写的代码进行测试:
预期输出:ERROR 1062 (23000) at line 2: Duplicate entry '王勇' for key 'Tname'
########## 定义教师表的完整性 ##########
#请在此处添加实现代码
########## Begin ##########
CREATE TABLE teacher(
Tno char(5),
Tname CHAR(9) UNIQUE NOT NULL, /*要求Dname列值唯一,且不能取空值*/
Tsex CHAR(1) CHECK(Ssex IN('M')),
Tage int,
Tdept char(20)
);
########## End ##########