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