SQL Server数据库应用基础(第2版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.3 建立和删除数据库表

2.3.1 以界面方式建立数据库表

1.以界面方式建立数据库表

在SQL Server Management Studio中,单击数据库StuInfo文件夹下的“表”,将显示该数据库中的所有用户表和系统表(SQL Server 2000中系统表与用户表是混在一起的)。系统表是创建数据库时自动生成的,并用来保存数据库自身的信息;用户表存储用户自定义的数据,下面我们来试着创建用户表。

选择并右击“表”,然后在弹出的快捷菜单中选择“新建表”选项,如图2.4所示,就可以在“表设计器”中输入和定义表不同的列,如图2.5所示。

图2.4 “新建表”选项

“表设计器”分为“表”标签页和“列属性”标签页两部分。在“表”标签页中可以定义各列的列名、数据类型和允许Null值3个主要属性,这与SQL Server 2000略有不同,它把数据类型和列宽合二为一了。“列属性”标签页包括除列名、数据类型、和允许Null值以外的属性。

图2.5 界面方式创建用户表

在创建表时除了要输入列的名称外,还需要确定该列的数据类型,因此,首先要对SQL Server提供的数据类型有所了解。

2.确定列的数据类型

SQL Server 2008中常用的数据类型如表2.3所示。

表2.3 SQL Server 2008常用的数据类型

3.是否为空值

表中的列是否为空值实际上也是一种约束,我们可以称为空约束,即如果该列为空,则在输入数据时,这一列的值可以不输入。

列是否为空与具体的要求有关,例如,学生的联系电话,有的学生家庭没有电话,这一列就允许为空值;有的学生家庭有电话,这一列就可以填写相应的值。

4.建立主键

确定列的名称、数据类型和允许为空之后,就完成了表的基本框架,如图2.6所示。

图2.6 确定数据库表中列的属性

我们已经讲过了主键的概念,那么怎样为数据库表创建主键呢?

建立主键的方法比较简单,首先选择要建立主键的列,单击右键,然后在弹出的快捷菜单中选择“设置主键”选项或者在左上角工具栏上单击即可,如图2.7所示。

在以SQL语句命令方式创建表主键或为表添加主键时,可以看出SQL Server是把主键作为约束来处理的,也就是说主键可以称为主键约束。

图2.7 确定数据库表的主键

5.设置默认值

对某项数据进行输入时,它总是存在一个“默认”的值,例如,学生基本情况表中的学生性别通常是“男”;学生的成绩如果不输入,则默认值为0,如图2.8所示的标注。

图2.8 设置默认值

6.设置标识列

在很多情况下,存储的信息中很难找到不重复的信息作为列的主键。例如,在学生奖惩表中,奖惩编号就是一个不允许重复的列,任何单位发放文件的编号都不希望有重复的编号等,如图2.9所示。

图2.9 设置标识列

SQL Server提供了一个“标识列”,特意对列进行区分,其本身没有具体的含义。标识列的实现必须注意如下4点:

(1)这一列的数据类型必须是整数,它可以是bigint、int、smallint、tinyint、decimal、numeric,其中decimal和numeric的小数位数必须为0时才可以作为标识列。

(2)定义成标识列后,还需要分别指定“标识种子”和“标识增量”,默认为值1。

(3)在输入该列数据时,第一次以标识种子开始,以后以标识增量增加数值。

(4)当删除某一条记录时,其他所有标识列的值不变;当增加一条新记录时,仍以前一次输入的标识列的值为基础,按标识增量增加。

当表中的所有列及主键、数据类型、宽度、允许Nuu值、标识列、默认值设置完成后,单击“保存”按钮,输入表的名称,该表即可创建完成。当要修改表的结构时,只要在选定表上右击并在弹出的快捷菜单中选择“设计”选项(SQL Server 2005中为“修改”),即可对已创建表的结构进行修改。

示例2.1

以界面方式建立一个学生基本情况表(tblStudent),建立的要求如表2.4所示。

表2.4 学生基本情况表(tblStudent)

建立表tblStudent的界面如图2.10所示。

图2.10 创建表tblStudent

7.以界面方式建立数据库表之间的关系

建立表之间的关系就是引用外键约束,建立主从表的关系。

假如我们已经建立了学生基本情况表(tblStudent)和学生成绩表(tblScore),学生成绩表含有如下字段,即StuID(学号)、CourseID(课程号)、Score(成绩)和Term(学期)(请先建立学生成绩表),学生成绩表中的字段学号(StuID)引用了学生基本情况表(tblStudent)中的字段学号(StuID),因此,学生基本情况表(tblStudent)是主表,而学生成绩表(tblScore)是从表。

建立表之间关系的操作步骤如下:

(1)建立学生成绩表,并保存。选择从表(学生成绩表)后右击,在弹出的快捷菜单选择“修改表”选项,在设计表时右击,在弹出的快捷菜单选择“关系”选项,如图2.11所示。

(2)单击“添加”按钮,并单击“表和列的规范”右面的,选择主表中的主键和从表中的外键,如图2.12所示。主从表的关系图如图2.13所示。

图2.11 设置外键关系

图2.12 设置表和列

图2.13 主从表的关系图

注意点:

(1)外键约束名“FK_tblScore_tblStudent”的格式要求为“FK_从表名_主表名”。

(2)学生成绩中的主键是组合键,即StuID和CourseID,其操作是按住【Ctrl】键的同时使用鼠标左键选中两列,并设置成主键。

8.以界面方式建立数据库表的检查约束

检查约束也称CHECK约束,用于定义列中可接受的数据值或者格式,属于域的完整性约束之一。例如,学生成绩表中的成绩列(Score)必须限制为大于等于0分且小于等于100分;学生基本情况表中的性别列(StuSex)应该只能是“男”或“女”两个值。

现以学生成绩表的成绩列(Score)为例,对其约束定义的步骤如下:

(1)在设计表时右击,在弹出的快捷菜单中选择“CHECK约束”选项,如图2.14所示。

(2)在对话框中,单击“添加”按钮,并单击“表达式”右边的,出现如图2.15所示的对话框,输入表达式的内容,单击“确定”按钮即可。

注意点:

· 表达式“Score>=0 and Score<=100”也可写成“(Score>=0 and Score<=100)”或“([Score]>=0 and [Score]<=100)”。

· 如果数据类型是字符型,需要对字符进行比较时,使用like运算符可以完成对字符的模糊匹配。例如,表达式要求学生姓名第二个字符是“子”的学生,则需要用通配符来表示,表达式为“StuName like '-子%'”。SQL Server 2008中的通配符如表2.5所示。

图2.14 “CHECK约束”对话框

图2.15 “CHECK约束表达式”对话框

表2.5 SQL Server 2008中的通配符

9.以界面方式建立数据库表的唯一性约束

唯一性约束(unique)也称唯一键约束,是SQL完整性约束类型中,除主键约束之外的另一种以定义唯一约束的类型。唯一性约束指定一个或多个列的组合值具有唯一性,以防止在列中输入重复的值。这点与主键约束相同,但是主键不允许空值,并且每个表中主键只能有一个,而在唯一性约束中允许空值,并且可以在多个列上定义。例如,学生基本情况表中的身份证号列(IdentityID)必须唯一,其步骤如下:

(1)在设计表时,右击,在弹出的快捷菜单中选择“索引/键”选项,如图2.16所示。

图2.16 “索引/键”选项

图2.17 “索引/键”对话框

(2)在弹出的对话框中单击“添加”按钮,选择“类型”为“唯一键”(非索引),修改“名称”为“UQ_tblStudent_IdentityID”,如图2.17所示。

(3)并单击“列”右边的按钮,出现如图2.18所示的对话框,选择列“IdentityID”,并设置其为“升序”,单击“确定”按钮即可。

图2.18 “索引列”对话框

2.3.2 以界面方式删除数据库表

如果确认某个表不再使用时,则可将其从数据库中删除,以节省存储空间;如果要删除的表是关联的主表,则不能直接将其删除;如果确定要删除主表,则应先删除该表所有的从表,然后才能删除主表。删除数据表的步骤如下:

(1)在删除数据库表时,首先要选中要删除的表,然后按【Delete】键或在右键快捷菜单中选择“删除”选项,如图2.19所示。

图2.19 右键快捷菜单

(2)在出现的窗口中单击“显示依赖关系”按钮,弹出“tblScore依赖关系”对话框,如图2.20所示,单击“确定”按钮即可删除要删除的表。

图2.20 “tblScore依赖关系”对话框

注意点:

单击图2.20中右下角的“显示依赖关系”按钮,在对话框的“依赖关系”中如果该表没有依赖,则可以确定删除,否则必须先删除关联的从表后才能删除主表。

2.3.3 以T-SQL语句命令方式建立数据库表

以T-SQL语句命令方法建立数据库表的步骤总结如下:

(1)确定表中有哪些列。

(2)确定每列的数据类型。

(3)为表添加各种约束。

(4)创建各表之间的关系。

建立数据库表的SQL语法如下:

create table   <表名>
( 列名1 列的数据类型及宽度等特征,
列名2 列的数据类型及宽度等特征,
…)

注意点:

· create table不能有书写错误,不区分大小写。

· 表名不能省,千万不能把“<”、“>”也写上,它仅表示“表名”是必选项。

· 有的数据类型有宽度,有的数据类型是默认宽度,不需要特别指定其宽度。

· 列的特征包括该列是否为空(null)、是否是标识列(identity(m,n),其中m为标识种子,n为标识增量)、是否为默认值、是否为主键、是否有其他约束等。

· 注意列定义后面的“,”号不能省略,不是“;”号。

· 如果创建表的语句含有引号,则只能是半角单引号“‘”。

· 最后的“)”号前没有“,”号。

· 约束是比较复杂的,希望读者一定要慢慢理解。

示例2.2

以SQL语句命令方式建立一个系别表(tblDepart),建立的要求如表2.6所示。

表2.6 系别表(tblDepart)

(1)单击SQL Server管理平台左上角的“新建查询”按钮,出现“SQLQuery”标签页。

(2)在“SQL Query”标签页中输入如下命令:

use StuInfo       /*打开数据库StuInfo*/
create table tblDepart       /*建立系别表*/
(
DepartID char(1) primary key,    /*系别编号为主键,主键必须非空*/
DepartName varchar(20) not null    /*系别名称非空*/
)

(3)创建系别表(tblDepart)界面如图2.21所示。

图2.21 创建系别表(tblDepart)界面

示例2.3

以SQL语句命令方式建立一个班级表(tblClass),建立的要求如表2.7所示。

表2.7 班级表(tblClass)

(1)单击SQL Server管理平台左上角的“新建查询”按钮,出现“SQL Query”标签页。

(2)在“SQL Query”标签页中输入如下命令:

create table tblClass              /*建立班级表*/
( ClassID char(6) primary key,     --班级号为主键,主键一定非空
   ClassName varchar(20) not null, --班级名称,非空(必填)
   EnrollYear char(4),             --入学年份,可为空,定长字符型,宽度为4个字节
   Speciality char(10),
       Length char(1),
   ClassNum tinyint,               --班级人数为整型,默认宽度为1个字节
   Flag char(4),
   DepartID  char(1) references tblDepart(DepartID)–-外键约束
)

(3)创建班级表(tblClass)界面如图2.22所示。

图2.22 创建班级表(tblClass)界面

示例2.4

以界面方式建立一个学生基本情况表(tblStudent),建立的要求如表2.8所示。

表2.8 学生基本情况表(tblStudent)

(1)单击SQL Server管理平台左上角的“新建查询”按钮,出现“SQL Query”标签页。

(2)在“SQL Query”标签页中输入如下命令:

create table tblStudent
(
   StuID char(8) primary key,
   StuName varchar(8),
   StuSex char(2)  default '男' check (StuSex in('男' ,'女')),
   Birthday datetime,
   EnrollDate datetime,
   IdentityID varchar(18) unique,
   ClassID char(6) references tblClass(ClassID)
)

(3)创建学生基本情况表(tblStudent)界面1如图2.23所示。

图2.23 创建学生基本情况表(tblStudent)界面1

示例2.5

为了使读者更好地理解约束,从示例2.4中可以看出创建学生基本情况表时使用了5种约束,这些约束都是系统自动给每个约束定义一个名称,如果用户想自己给每个约束定义一个名称,则需要把每个约束修改如constraint<用户定义的约束名>形式,这样创建学生基本情况表(tblStudent)的程序清单如下:

create table tblStudent3
(
StuID char(8)
constraint  PK_tblStudent primary key ,              --主键约束名PK_tblStudent
StuName varchar(8) not null,
StuSex char(2)
constraint DF_tblStudent  default '女'      --默认约束名DF_tblStudent
constraint CK_tblStudent  check (StuSex in('男' ,'女')),
--检查约束名CK_tblStudent
Birthday datetime,
EnrollDate datetime,
IdentityID  varchar(18)
constraint  UQ_tblStudent  unique,                --唯一性约束名UQ_tblStudent ClassID   char(6)
constraint FK_tblStudent foreign key  references  tblClass(ClassID)
--外键约束名FK_tblStudent
)

注意点:

· 外键必须在从表中。

· 外键引用列必须在主表中是主键或唯一键,即使标识列也不行。

· 外键列与引用列的数据类型和宽度必须相同,但名称不一定相同。

· 在数据库中如果存在同名的对象(如PK_tblStudent,主键约束),将不允许创建。

· 表中约束的启停操作。

(1)可以使用SSMS对表中的约束进行添加、删除、修改和启停操作。

(2)启用和暂停约束的T-SQL命令语法如下:

alter table tblStudent nocheck constraint <约束名|all>

使用check或nocheck选项可以启用或暂停某些或全部约束,但是对于主键约束、唯一性约束和默认约束不起作用。

示例2.6

从示例2.5的程序清单中可以看出,每个列定义的约束都在该列的列名和数据类型及宽度之后,不需要指定约束对应的列是哪一个,如果用户想自己给每一个约束定义一个名称,并且集中在一起,则需要建立如下的程序清单,但默认约束仍用示例2.5中程序清单的格式,无法单独指定默认约束对应的具体列。

(1)程序清单如下:

use StuInfo
create table tblStudent4
( StuID char(8),
    StuName varchar(8)  not null,
    StuSex char(2)
    constraint  DF_tblStudent default '女' ,
  --默认约束名DF_tblStudent,不可集中在最后,因其无法对应具体的列
    Birthday datetime,
    EnrollDate datetime,
    IdentityID varchar(18),
    ClassID char (6),
    constraint  PK_tblStudent primary key(StuID),  --主键约束名PK_tblStudent
    constraint  CK_tblStudent  check (StuSex in(‘男’,‘女’)) ,
  --检查约束名CK_tblStudent
    constraint  UQ_tblStudent  unique (IdentityID) ,
  --唯一性约束名UQ_tblStudent
  constraint FK_tblStudent foreign key (ClassID) references tblClass(ClassID)
  --外键约束名FK_tblStudent
  )

(2)创建学生基本情况表(tblStudent)界面2如图2.24所示。

图2.24 创建学生基本情况表(tblStudent)界面2

2.3.4 以SQL语句命令方式删除数据库表

使用SQL语句命令方式删除数据库表的操作非常简单,如果当前数据库存在一个已经建立的表,但它又不满足要求,需要重新建立一个表,则我们先将原表删除,再创建新表。

删除表的SQL Server语法如下:

drop table  <表名>

示例2.7

删除学生基本情况表(tblStudent)的步骤如下:

(1)单击SQL Server管理平台左上角的“新建查询”按钮,出现“SQL Query”标签页。

(2)在“SQL Query”标签页中输入如下SQL命令:

drop table tblStudent

删除学生基本情况表(tblStudent)界面如图2.25所示。

图2.25 删除学生基本情况表(tblStudent)界面

注意点:

有时删除表不一定成功,这是因为被删除的表是被引用表,它存在从表(子表),因此需要先删除该表的所有从表(子表),再删除该表,其SQL语法如下:

drop table <从表>,<主表>

例如,删除学生基本情况表(tblStudent)、班级表(tblClass)、系别表(tblDepart)的SQL语法如下:

drop table tblStudent,tblClass ,tblDepart