头歌 第1关:用户定义的完整性

任务描述

本关任务:定义教师表的完整性。

相关知识

为了完成本关任务,你需要掌握:1.用户定义的完整性,2.属性上的约束条件,3.元组上的约束条件。

用户定义的完整性

任何关系数据库系统都应该支持实体完整性和参照完整性,这是关系模型所要求的。除此之外,不同的关系数据库系统根据其应用环境的不同,往往还需要一些特殊的约束条件。

用户定义的完整性就是针对某一具体关系数据库的约束条件,它反映某一具体应用所涉及的数据必须满足的语义要求。力图某个属性必须取唯一值、某个非主属性不能取空值等。

属性上的约束条件
属性上约束条件的定义

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

  • 列值非空(NOT NULL)

  • 列值唯一(UNIQUE)

  • 检查列值是否满足一个条件表达式(CHECK短语)

例如在定义 SC 表时,说明 Sno、Cno、Grade 属性不允许取空值:

 
  1. CREATE TABLE SC(
  2. Sno CHAR(9) NOT NULL, /*Sno属性不允许取空值*/
  3. Cno CHAR(4) NOT NULL, /*Cno属性不允许取空值*/
  4. Grade SMALLINT NOT NULL, /*Grade属性不允许取空值*/
  5. PRIMARY KEY(Sno,Cno) /*在表级定义实体完整性,隐含了Sno、Cno不允许取空值,在列级不允许取空值的定义可不写*/
  6. );

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

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

例如创建 Student 表的Ssex 只允许取“男”或“女”:

 
  1. CREATE TABLE Student(
  2. Sno CHAR(9) PRIMARY KEY, /*在列级定义主码*/
  3. Sname CHAR(8) NOT NULL, /*Sname属性不允许取空值*/
  4. Ssex CHAR(2) CHECK(Ssex IN('男','女')), /*性别属性Ssex只允许取‘男’或‘女’*/
  5. Sage INT
  6. );
属性上约束条件的检查和违约处理

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

元组上的约束条件
元组上约束条件的定义

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

例如在创建 Student 表时当学生的性别是男时,其名字不能以Ms.开头:

 
  1. CREATE TABLE Student(
  2. Sno CHAR(9),
  3. Sname CHAR(20) NOT NULL,
  4. Ssex CHAR(2),
  5. Sage INT,
  6. CHECK(Ssex='女' OR Sname NOT LIKE 'Ms.%') /*定义了元组中Sname和Ssex两个属性值之间的约束条件*/
  7. );

性别是女性的元组都能通过该项 CHECK 检查,因为Ssex='女'成立;当性别是男性时,要通过检查则名字一定不能以Ms.开头,因为Ssex='男'时,条件要想为真值,Sname NOT LIKE 'Ms.%'必须为真值。

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

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

编程要求

在右侧编辑器补充代码,在右侧编辑器Begin-End处补充代码,定义教师表(teacher)的完整性,要求教师名称 Tname 列取值唯一,教师表结构及插入信息如下:

教师表结构:

字段名称类型备注
Tnochar(5)编号
Tnamechar(8)姓名
Tsexchar(1)性别
Tageint年龄
Tdeptchar(20)所属部门

教师表插入信息如下:

TnoTnameTsexTageTdept
T02王勇M38后勤部
T03王勇M20研发部

观察发现我们插入数据的 Tname 属性值是两个重复的人名也就不唯一了,与我们要求的唯一性相违背,因此系统会提示错误信息:

 
  1. 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 ##########

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据库完整性实验】实验完整代码 打开ScoreDB数据库,完成以下操作: (1)分别定义ScoreDB数据库中各基表的主键、外键,实现实体完整性约束和参照完整性约束; (2)往student表插入一条跟已有的学号相同的学生数据,验证实体完整性约束; (3)向score表中插入一条数据,其中数据中的课程编号是课程表中没有的,验证参照完整性约束; (4)修改score表中一条数据的课程编号,该编号是课程表中没有的,验证参照完整性约束; (5)删除student表中的一条数据(其中学号出现在score表中),验证参照完整性约束。 (6)增加score表的约束条件,要求成绩在0-100之间。增加student表的约束条件,要求性别只允许取“男”或“女”。 (7)创建一个触发器student_update,实现功能:如果在学生表中修改了学号,则自动修改成绩表中的学号。 (8)创建一个级联删除触发器student_delete。要求:当从学生表中删除某学生信息时,同时删除score表中此学生相的选课记录。 (9)创建一个触发器student_insert,实现功能:如果往学生表中插入数据,则自动修改班级表中的班级人数classNum。(如果改为删除数据,代码要怎么改?) (10)建立一个触发器course_check,每当删除课程表中记录时,先检查此课程是否已被选修,如选修则不允许删除,且给出提示信息“此课程已有学生选修,无法删除!”。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值