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和规则实现域完整性。