6.4 练习与实训
图6.11 外键的作用
如图6.11所示选课表中的每个课程号都必须存在于课程表的学号列,其实质是被选修之课程必定是已开设的课程。对它们而言,课程表是主表,选课表是从表。
输入或修改基本表参照列的数据时,一旦新的数据不在被参照列之中,则SQL Server会拒绝这个数据,并立即反馈消息,如图6.12所示。

图6.12 外键冲突时系统自动阻止
5)检查(Check)
用于约束输入列中的值,只有符合Check条件的值才能通过核查而被接受。Check约束实现的是关系模式的域完整性。检查约束的语法格式为
CHECK(条件表达式)
其中,约束的条件表达式根据实际情况构造,例如,
sex char(2)CHECK(sex in(′男′,′女′)) DEFAULT′男′
sex char(2)CHECK(sex=′男′OR sex=′女′)DEFAULT′男′
phone char(8)CHECK(phone LIKE′[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]′)
ct int CHECK(ct BETWEEN 8 AND 320)
都定义了CHECK约束。关于条件表达式留待以后详细介绍。
6)默认值(Default)
如果为表的某个列设置了一个默认值,则每当用户没有在该列输入值时,它就会自动取预先定义下的默认值。例如,
sex char(2)CHECK(sex=′男′OR sex=′女′)DEFAULT′男′
中,就指定了sex的默认值是′男′。
6.2.3 查看表信息
表的信息可以在可视化界面查看,也可以使用T-SQL语句查看。
(1)使用可视化方法查看
右键单击基本表的表名,打开属性。属性窗口包含常规、权限和扩展属性3个选择页。在属性窗口可以查看和设置表的属性。
在对象资源管理器中,展开表名称及其下级节点就可以直观查看该表的列、键、约束、索引等基本信息,如图6.13所示。

图6.13 在对象资源管理器中查看表的信息
(2)用系统存储过程sp_help查看数据库对象的信息系统存储过程sp_help可用来查看数据库对象的信息。
基本表就是一种数据库对象。其他数据库对象包括诸如视图、存储过程、用户定义函数、触发器、规则、默认和约束等对象。
执行sp_help的语法格式如下:
EXEC[UTE] sp_help [[@objname=]′name′]
如果未指定name,则sp_help将列出当前数据库中所有对象的汇总信息,包括对象名称、所有者和对象类型。
例6.1 查看课程表course的信息。
EXEC sp_help Course
执行结果,如图6.14所示。

图6.14 表的属性窗口
显示的信息主要可分为以下5个方面:
①表的一般信息,包括Name(名称)、Owner(所有者)、Type(类型)和Created-Datetime(创建时间)。
②列信息,包括列名、数据类型、长度、是否允许空等。
③标识、索引、数据存储的文件组等。
④约束信息,包括类型、名称、约束的键或表达式。
⑤被其他外键参照的信息。
6.2.4 修改表结构的ALTER TABLE语句
数据库使用中需求会发生变化,可能会要求修改基本表的结构。在SQL Server中除了可用可视化方法修改之外,也可用T-SQL的ALTER TABLE语句修改。
修改表结构有一些限制,如不能删除主键列,不能将已有数据的列修改为NOT NULL。总之,必须注意修改表结构的最基本原则———保证表的完整性不被破坏。
ALTER TABLE语句的格式为:
ALTER TABLE<表名>
[ADD {<列名><数据类型>[完整性约束]} //添加新的列及其数据类型和完整性约束
|[WITH [CHECK|NOCHECK]] //检查或不检查已有的数据
|[ADD <列约束>[,爥n] //增加列约束
|[ALTER COLUMN <列名> //修改该列
{<新数据类型>[新完整性约束]]} //修改其数据类型和完整性约束
|[DROP COLUMN <列名>[,爥n]] //删除该列
|[DROP [CONSTRAINT]<完整性约束名>[,爥n]]//删除指定的完整性约束
|[CHECK|NOCHECK]CONSTRAINT //启用或禁用约束
{ALL|<约束名>[,爥n]}] //所有约束或指定的约束
说明:删除完整性约束时,要指定约束的名称。SQL Server 2005中,除NULL/NOT NULL外,定义时如果用户没有命名,则系统会自动分配一个名称。
例6.2 给学生表添加一个字段:Partisan,char(8),允许空,默认值“团员”。
use jxgl
ALTER TABLE student
ADD partisan char(8)default′团员′null
Go
说明:添加新的字段,必须允许为NULL,原有记录此列的值一律为NULL。
例6.3 给课程表Course的课程名字段cn增加唯一约束,并且不检查以前的数据。
use jxgl
go
alter table course
with nocheck
add constraint uk_cou_cn unique(cn)
go
例6.4 给student表的partisan列增加check约束,限制取值团员、党员、群众3种之一。
use jxgl
ALTER TABLE student
Add constraint ck_stu_part CHECK(partisan IN(′团员′,′党员′,′群众′))
go
例6.5 删除student表的partisan列。
use jxgl
ALTER TABLE student
Drop column partisan
go
执行时,反馈如图6.15所示出错信息。
信息表明:有两个对象(一个默认约束、一个Check约束)依赖本列。因此,删除某列之前必须先去掉该列的约束(NULL和NOTNULL除外),如图6.16所示。

图6.15 不能删除有约束的列
例6.6 删除student表上的约束。
alter table student
drop ck_stu_part,DF__student__partisa__2D27B809

此时再重新执行例6.5的命令,就可顺利删除partisan列,如图6.17所示。

图6.17 删除partisan列
6.2.5 删除表的DROP TABLE语句
删除不再使用的基本表,其T-SQL语句如下:
DROP TABLE <表名>
也可在SSMS的对象资源管理器中直接用鼠标右键单击表的名称,用快捷菜单中的“删除”命令予以删除。
注意:建立了外键关系的主表不能删除,必要时应该先删除其参照完整性约束,然后就可删除它了。如果被删除的表是建立了索引、视图的,则那些索引和视图也会被系统自动删除。
6.2.6 规则
(1)规则的作用和特性
规则(Rule)用来对数据库中表的列值或用户自定义数据类型的取值进行限制。
规则是单独存储的、独立的数据库对象,规则与其作用的表或用户自定义数据类型是相互独立的,即使删除、修改表或用户自定义对象都不会对与之相连的规则产生影响。
一个规则可以同时作用于多个表或用户自定义数据类型。但是表的每一列最多只能加一个规则。
(2)规则与检查约束(CHECK)的异同
功能上规则与CHECK约束很相似。相比之下,在ALTER TABLE或CREATE TABLE命令中的CHECK约束是更标准的限制列值的方法,但CHECK约束不能直接作用于用户自定义数据类型。
规则和约束可以同时使用,表的列可以有一个规则及多个CHECK约束。
例如,学生表、教师表、教工表等都包含有性别字段,其取值都只能是“男”或“女”。如果采用CHECK约束的方法,则需要在每张表的性别字段中定义这个Check约束。如果采用规则的话,就只需要定义一个规则,然后令这个规则作用于上述每张表就可以了。显然,如果适用同一约束的表越多,从创建、管理来看选用规则就越高效。
(3)使用规则
要使用规则约束表中列值首先要创建这个规则,然后将这个规则绑定到表上。若要取消原来绑定在表上的规则,可解除绑定。不再有用的规则可删除。
1)创建规则
创建规则的语法格式如下:
CREATE RULE <规则名>
AS
<条件表达式>
这里的条件表达式包括一个局部变量(名称以@开头)。
例6.7 创建一个约束职称字段取值的规则rule_title。
CREATE RULE rule_title
AS
@post in(′正教授′,′副教授′,′研究员′,′讲师′,′工程师′,′助教′,′助工′)
GO
创建约束职称字段取值的规则如图6.18所示。

图6.18 创建约束职称字段取值的规则
2)绑定规则
使用系统存储过程sp_bindrule绑定规则,其语法格式如下:
EXEC sp_bindrule[@rulename=]′<规则名>′,
[@objname=]′<对象名>′
这里<对象名>即需要绑定规则的表和用户自定义数据。要绑定到表的某列,书写格式是′表名.列名′,要加引号。
注意:不能将规则绑定到text,ntext,image,varchar(max),nvarchar(max),varbinary(max),xml或timestamp列,无法将规则绑定到计算列。
例6.8 将规则rule_title绑定到教师表的职称列。
EXEC sp_bindrule rule_title,′Teacher.zc′
GO
绑定规则如图6.19所示。

图6.19 绑定规则
下面插入一条记录来看看它们的作用,如图6.20和图6.21所示。

图6.20 插入含有字母的电话号码被规则阻止

图6.21 插入含有非正常职称数据被规则阻止
3)解除绑定
使用系统存储过程sp_unbindrule解除对象上绑定的规则:
EXEC sp_unbindrule[@objname=]′object_name′
例6.9 解除绑定在教师表上的规则rule_title。
EXEC sp_unbindrule′Teacher.zc′
解除教师表职称列上绑定的规则如图6.22所示。解除规则后,含有非正常职称的数据被接受,如图6.23所示。
4)删除规则
删除规则的语法格式如下:
DROPRULE <规则名>[,爥n]
注意:删除前要先解除绑定。

图6.22 解除教师表职称列上绑定的规则

图6.23 解除规则后,含有非正常职称的数据被接受
6.2.7 默认值
默认值也是独立的数据库对象,其作用与定义表结构时使用的Default约束完全一样。与规则类似同一个默认值可绑定到若干张表、多个列上,当然一个列也只能绑定一个默认值。
注意:定义表、修改表的时候已经用DEFAULT约束制订了默认值的列不能再绑定默认值。
默认值的使用也与规则相似,首先要创建,然后再绑定,默认值也可解除绑定、删除。
创建默认值:
CREATE DEFAULT<默认值名> AS 常量表达式
绑定默认值:
EXEC sp_bindefault ′默认值名′,′对象名′
这里的′对象名′是要绑定默认值的对象,如表。例如,要将默认值def_rooms绑定到表Dmormitory的totalrooms列,可执行以下语句:
EXEC sp_bindefault def_rooms,′Dormitory.totalroom′
解除绑定的默认值:
EXEC sp_unbindefault ′对象名′
6.2.8 插入记录、更新数据和删除记录
插入记录、更新数据和删除记录是数据库的基本操作任务。
(1)插入记录
插入记录就是往基本表里面添加记录。插入记录的T-SQL语句是INSERT语句,它可一次插入一条记录的数据,也可将查询结果集插入基本表中。
1)插入一条记录的语法格式
INSERT INTO <表名>[(列名1[,列名2,爥])]
VALUES(数据1[,数据2,爥])
其中:
<表名>:是要插入记录的表。
列名1,列名2,…:是要插入数据的字段名。其顺序可与表定义时的顺序不一致。如果所有列都要输入数据。
数据1,数据2,…:具体的输入数据,为常量。所有数据都必须与其列名的顺序一一对应。字符型、日期型数据要加单引号。如果要输入空值,则写为NULL,要使用默认值则表达为DEFAULT。
注意:定义为NOTNULL的字段必须输入数据。省略列名时,数据的顺序要与表中列的顺序一致,否则会发生错乱。对于自动取值的标识列,不能输入。
例6.10 向选课表SC插入一条记录,学号为1102005,课程号C03,成绩为77。
use jxgl
go
insert into SC
values(′1102005′,′C03′,77)
go
因为包含了所有列,所以列名省略了。
例6.11 向选课表SC插入一条记录,学号为1102005,课程号C05。
use jxgl
go
Insert into SC(sno,cno)
values(′1102005′,′C05′)
go
由于不输入成绩数据,故列名列表不能省略。此语句执行后,该记录的成绩(Score)列的值为空(NULL)。此语句与Insert into SC values(′1102005′,′C05′,NULL)等价。2)插入查询结果集的语法格式
INSERTAS INTO<目标表名称>[(列名1[,列名2,…])]
SELECT [列名A[,列名B,…]] FROM <源表名称> [WHERE <条件表达式>]
例6.12 要求将SC表中成绩达到90分的记录添加到优秀生表excellent,设表excellent的结构为学号char(7),课程号char(3),课程分数int,成绩等次char(6)。
编辑如下语句并执行,其结果如图6.24所示。使用SELECT查询语句查询该表记录如图6.25所示。
USE JXGL
INSERT INTO excellent(学号,课程号,课程分数)
SELECT sno,cno,score FROM SC
WHERE score>=90
GO

图6.24 将查询结果集插入表中

图6.25 查询表Execllent中的全部记录
(2)更新数据
更新数据是指将记录中原有数据值修改为新的数据值,其语句格式为:
UPDATE <表名称>
SET <列名1>=<表达式1>[,<列名2>=<表达式2>,…]
WHERE <条件表达式>
其中:
<列名1>=<表达式1>:用<表达式1>的值替换<列名1>原来的值。
<条件表达式>:指定操作条件,只有符合<条件表达式>的记录才会被修改。如果缺省WHERE子句,则所有记录都会被修改。
例6.13 将选课表中学号为1102005的同学、课程号为C05的成绩修改为80分。
输入以下T-SQL语句:
USE JXGL
UPDATE SC
SET score=80
WHERE sno=′1102005′ AND cno=′C05′
GO
语句执行结果如图6.26所示。

图6.26 修改学号1102005同学C05课程的成绩
例6.14 将优秀学生表(Excellent)中的成绩等次列修改为“优秀”。
输入以下更新并查看数据的语句,执行结果如图6.27所示。
UPDATE Excellent //更新表Excellent
SET 成绩等次=′优秀′ //成绩等次列为优秀
GO
select倡from excellent //查看修改后的情况
GO

图6.27 修改Excellent表的成绩等次列为“优秀”并查看结果
(3)删除记录
无用的记录可以使用DELETE语句将其删除,语法格式为:
DELETE FROM <表名称> [WHERE <条件表达式>]
说明:语句的功能是删除符合条件的记录。如果没有条件子句则将删除表中全部记录,使得表成为只有表结构而无任何记录的空表。
注意:被删除的记录不可恢复。
例6.15 删除Excellent表中学号为1101002的学生的记录。
DELETE FROM Excellent
WHERE sno=′1101002′
例6.16 删除Excellent表中所有记录。
DELETE FROM Excellent
命令执行后,可使用查询语句SFELECT倡FROM Excellen来查看该表中的记录情况。
6.3 任务小结
本次任务主要完成了教学管理数据库中7张基本表的定义。在此过程中学习、使用了定义表、修改表、查看表信息和删除表的知识和操作方法。同时还学习了应用规则和默认实现完整性约束的知识和方法。
基本表是存储记录数据的数据库对象。定义基本表是最重要和最基础的工作。CREATE TABLE是定义基本表的语句。
定义基本表需要明确表的名称、每列的列名和数据类型,定义基本表的结构还要定义数据完整性约束。完整性约束分为列级约束和表级约束。
在SQL Server 2005中,表结构上可以使用的完整性约束包括主键约束、唯一约束、外键约束、CHECK约束、NULL或NOT NULL约束、DEFAULT约束。
修改表结构的语句ALTER TABLE具有添加列或删除列、添加或删除约束、修改约束等多项功能。
删除基本表使用DROP TABLE语句。
规则是可用于实现表中数据完整性的独立数据库对象之一,其作用与CHECK一样。一个规则可应用到多个列上,一个列只能使用一个规则。规则的应用和管理包括创建、绑定、解除绑定和删除等操作。
默认值也是一个独立的数据库对象,其作用与CRAETE TABLE中的DEFAULT一样。默认值的使用与管理包括创建、绑定、解除绑定和删除。
数据库中记录数据的增、删、改是最为频繁的日常操作,T-SQL专门设计了相应的数据操作语句,它们是INSERT语句、UPDATE语句和DELETE语句。UPDATE语句和DELETE语句都可以指定操作条件。
6.4 练习与实训
(1)填空题
①定义基本表的语句是_____,修改基本表的语句是_____,删除基本表的语句 是_____。
②定义或修改基本表的时候可以使用的完整性约束包括_____ 、_____、_____、_____、_____、_____、_____。
③查看表信息使用的系统存储过程是_________。
④添加记录的语句是_____、修改记录数据的语句是_____、删除记录的语句 是_____。
(2)选择题
①要定义一个字段,以下哪个内容不是必须说明的?( )
A.数据类型 B.列名 C.是否为空 D.完整性约束
②每个表允许( )个唯一性约束。
A.没有限制 B.至少两个 C.最多3个 D.只能有一个
③SQL Server 2005中的数据类型不包含( )。
A.音频型 B.日期时间型 C.字符型 D.位类型
④插入数据时在以下情况下,哪种不会出错?( )
A.对非空值插入空 B.对字符类型的数据输入数字
C.关键字字段输入重复数据 D.数字型字段输入了字符
⑤NULL表示什么?( )
A.空串 B.什么都没有 C.数字零 D.没有意义
⑥对学生基本信息表的“性别”列而言,最简单明了的数据类型是( )。
A.int B.char(2) C.bit D.smallint
⑦关于表的约束,下面错误的是( )。
A.非空约束实现的是实体完整性
B.主键实现的是实体完整性
C.外键实现的是参照完整性
D.检查(Check)约束用来检查输入数据的合法性
⑧有关UNIQUE约束和PRIMARY约束的描述,以下错误的是( )。
A.定义了UNIQUE约束的列可以为空值,但定义了PRIMARY约束则不可为空值
B.一个表可以有多个UNIQUE约束,但只能有一个PRIMARY约束
C.某个单列上定义了UNIQUE约束,则该单列上只能至多出现一次空值
D.已经定义了PRIMARY约束的列为确保非空,要加上NOT NULL
⑨关于表的约束不正确的是( )。
A.每张表可以定义多个唯一约束 B.唯一约束与主键约束一样,不允许有相同的值
C.每张表只能定义一个唯一约束 D.唯一约束不能取代主键约束
⑩( )不是数据表上的约束。
A.检查 B.外键 C.等价 D.非空
(3)问答题
①什么是表级约束?
②什么是主表?什么是从表?
③Check约束与规则有何异同?
(4)实训题
①按照任务4的实训任务2所得出的“华龙图书室”表结构设计结构以及任务5创建完成的“华龙图书室”数据库,使用CREATE TABLE等相关T-SQL语句定义各个基本表。
②在实训操作中对不完善的、需要改进的设计可作出必要修改。
③要求应用Check和规则实现域完整性。