《第6章数据完整性控制》由会员分享,可在线阅读,更多相关《第6章数据完整性控制(87页珍藏版)》请在金锄头文库上搜索。
1、第6章数据完整性控制本章学习目标通过本章的学习,达到以下目标:l理解数据完整性的概念、类型及实现方式。l掌握使用约束来实现数据完整性。l掌握使用IDENTITY列实现数据完整性。l掌握使用默认值对象和规则实现数据完整性。本章目录数据完整性概述数据完整性概述6.1使用约束实现数据完整性使用约束实现数据完整性6.2使用使用IDENTITY列列6.3默认值和规则默认值和规则6.4实训实训66.56.1数据完整性概述6.1.1数据完整性定义数据完整性是指数据的精确性和可靠性,主要用于保证数据库中数据的质量。它是为防止数据库中存在不符合语义规定的数据和防止因错误信息的输入/输出造成无效操作或报错而提出的
2、。6.1.2数据完整性类型实体完整性实体完整性,又称行完整性,用于保证表中的每一行数据在表中是唯一的。保证实体完整性的措施:PRIMARYKEY约束、UNIQUE约束或IDENTITY列。域完整性域完整性,又称列完整性,是指数据表特定列输入的有效性。用来保证列值的有效性与正确性。保证域完整性的措施:限制数据的类型或格式、CHECK约束、DEFAULT约束、NOTNULL约束或规则。参照完整性参照完整性,又称引用完整性,是建立在外键与主键或外键与唯一键之间的一种引用规则。保证参照完整性的措施有FOREIGNKEY约束。用户定义完整性用户定义的不属于其他任何完整性类别的特定业务规则,称为用户定义完
3、整性。所有完整性类别都支持用户定义完整性。6.1.3实现数据完整性的方式SQLServer2008中采用两种方式实现数据完整性。1声明数据完整性声明数据完整性是通过在数据库中定义一系列的数据约束与验证标准,并由数据库系统自身在插入、修改、删除数据时自动实施这些标准的一种数据完整性实现手段。声明数据完整性主要通过定义与使用约束、默认值与规则来实现。2过程数据完整性过程数据完整性是通过在脚本语言中定义一系列的数据约束与验证标准,并在脚本执行过程中强制完成这些标准的检验。过程数据完整性主要通过定义与使用视图、触发器和存储过程来实现。本章仅介绍声明数据完整性的实现方法与技术。6.2使用约束实现数据完整
4、性6.2.1约束概述1约束定义约束(constraint)是SQLServer2008提供的自动保持数据库完整性的一种方法。约束就是限制,定义约束就是定义可输入表或表的单个列中的数据的限制条件。2约束分类在SQLServer中有6种约束:主键约束(primarykeyconstraint)唯一约束(uniqueconstraint)外键约束(foreignkeyconstraint)检查约束(checkconstraint)默认约束(defaultconstraint)非空约束(notnullconstraint)约束与完整性之间的关系约束与完整性之间的关系完整性类型完整性类型约约 束束 类类
5、 型型描描 述述约约 束束 对对 象象实体完整性primary key每行记录的唯一标识符,确保用户不能输入重复值,并自动创建索引,提高性能,该列不允许使用空值行unique在列集内强制执行值的唯一性,防止出现重复值,表中不允许有两行的同一列包含相同的非空值,该列允许使用空值域完整性check指定某一列可接受的值列default当使用INSERT语句插入数据时,若已定义默认值的列没有提供指定值,则将默认值插入记录中NOT NULL指定某一列的值不能为空参照完整性foreign key定义一列或几列,其值与其他表的主键或unique列相匹配表与表之间3约束名在创建约束时,需要创建约束的名称,约束
6、名称必须符合标识符命名规则。建议使用约束类型和其完成任务的从句组合作为约束名。例如,学生信息表的主键使用PK_学生信息表。4创建约束的语法格式(1)使用CREATETABLE语句创建约束其语法格式如下:CREATETABLE表名(,|)其中,参数说明如下。表名:是合法标识符,最多可有128个字符。:(2)使用ALTERTABLE语句创建约束其语法格式如下:ALTERTABLE表名ADD在SQLServer中对基本表的约束分为:列约束:是对某一个特定列的约束,包含在列定义中,直接跟在该列的其他定义之后,用空格分隔,不必指定列名。表约束:与列定义相互独立,不包括在列定义中,通常用于对多个列一起进行
7、约束,与列定义用“,”分隔,定义表约束时必须指出要约束的那些列的名称。6.2.2主键约束主键约束(primarykeyconstraint)用于指定表的一列或几列的组合来唯一标识表,即能在表中唯一地指定一行记录,这样的一列或列的组合称为表的主键(primarykey,PK)。定义主键约束的列其值不可为空、不可重复。每个表中只能有一个主键。1使用SSMS创建主键约束【例6.1】在学生成绩数据库中,创建第1章中设计的系部表,表的结构如表1-10所示。分析:在例5.2中已经创建系部表,但是没有设置主键约束,且已经在例5.12中删除,在此利用SSMS重新创建具有主键约束的系部表。具体操作步骤如下:1)
8、启动SSMS。2)在【对象资源管理器】窗口中,展开【数据库】|【学生成绩】|【表】节点。右击【表】节点,在弹出的快捷菜单窗口中执行【新建表】命令,打开表设计器。3)在表设计器中,在【列名】单元格输入字段名“系部编号”,在同一行的【数据类型】单元格设置该字段的数据类型为char(2),并在【允许Null值】列选择不允许该字段为空值。4)重复步骤(3)设置“系部名称”、“系部主任”列。5)将光标定位在“系部编号”行。6)单击SSMS工具栏上的按钮设置主键,“系部编号”行显示一个钥匙图标,如图6-3所示。7)执行【文件】|【保存】命令或单击工具栏上的保存按钮,在打开的对话框中输入表名称“系部表”,单
9、击【确定】按钮保存表。图6-3 系部表结构2在创建表的同时创建主键约束1)创建单个列的主键可采用列级约束,它的语法格式如下。CREATETABLE表名(列名CONSTRAINT约束名PRIMARYKEYCLUSTERED|NONCLUSTERED,n)2)多个列组合的主键约束,采用表级约束,它的语法格式如下。CREATETABLE表名(CONSTRAINT约束名PRIMARYKEYCLUSTERED|NONCLUSTERED(列名1,列名n),n)其中,CLUSTERED为默认值,表示创建聚集索引,NONCLUSTERED表示创建非聚集索引。【例6.2】在学生成绩数据库中,创建如表1-11所示
10、的课程信息表。在查询编辑器窗口中执行如下Transact-SQL语句:USE学生成绩GOCREATETABLE课程信息表(课程编号char(4)NOTNULLPRIMARYKEY,课程名称varchar(30)NOTNULL,学分decimal(3,1)NULL,学时intNULL,考核类型char(4)NULL)GO【说明】列约束包含在列定义中,直接跟在该列的其他定义之后,用空格分隔,不必指定约束名,系统自动给定约束名。【例6.3】在学生成绩数据库中,创建如表1-12所示的成绩表。分析:由于创建的是组合主键约束,所以只能采用表级约束。在查询编辑器窗口中执行如下Transact-SQL语句。U
11、SE学生成绩GOCREATETABLE成绩表(CONSTRAINTPK_成绩表PRIMARYKEY(学号,课程编号),学号char(8)NOTNULL,课程编号char(4)NOTNULL,成绩decimal(4,1)NULL)GO【说明】 创建多个列组合的约束(如组合主键)时,只能将其定义为表级约束。 定义时必须指出要约束的那些列的名称,与列定义用“,”分隔。3在一张现有表上添加主键约束(1)使用SSMS添加主键约束在【对象资源管理器】窗口中,右击要添加主键约束的表,在弹出的快捷菜单中执行【设计】命令,利用表设计器添加主键约束。(2)利用ALTERTABLE语句它的语法格式如下:ALTERT
12、ABLE表名ADDCONSTRAIN约束名PRIMARYKEYCLUSTERED|NONCLUSTERED(列名1,列名n)【例6.4】为例5.1和例5.2中创建的“学生信息表”和“班级表”添加主键约束。分析:在例5.1和例5.2中创建的“学生信息表”和“班级表”不带主键约束,在此添加约束,修改表定义,使用ALTERTABLE语句。在查询编辑器窗口中执行如下Transact-SQL语句。USE学生成绩GOALTERTABLE学生信息表ADDCONSTRAINTPK_学生信息表PRIMARYKEY(学号)GOALTERTABLE班级表ADDCONSTRAINTPK_班级表PRIMARYKEY(班
13、级编号)GO4删除主键约束(1)使用SSMS删除在【对象资源管理器】中,展开【数据库】|【学生成绩】|【表】|【要删除约束的表】|【键】节点,右击【主键约束名】,在弹出的快捷菜单中执行【删除】命令即可。(2)使用Transact-SQL语句删除约束的语法格式如下。ALTERTABLE表名DROPCONSTRAINT约束名1,约束名n6.2.3唯一约束唯一约束(uniqueconstraint)用于指定非主键的一个列或多个列的组合值具有唯一性,以防止在列中输入重复的值,也就是说如果一个数据表已经设置了主键约束,但该表中还包含其他的非主键列,也必须具有唯一性,为避免该列中的值出现重复输入的情况,必
14、须使用唯一约束(一个数据表不能包含两个或两个以上的主键约束)。唯一约束与主键约束的区别如下:唯一约束指定的列可以为NULL,但主键约束所在的列则不允许为NULL。一个表中可以包含多个唯一约束,而主键约束则只能有一个。1使用SSMS创建唯一约束【例6.5】为例6.1中创建的“系部表”的“系部名称”列设置唯一约束。具体操作步骤如下。1)在【对象资源管理器】窗口中,展开【数据库】|【学生成绩】|【表】节点。右击【dbo.系部表】节点,在弹出的快捷菜单中执行【设计】命令,打开表设计器。2)在表设计器中,将光标定位在“系部名称”行,右击,在弹出的快捷菜单中执行【索引/键】命令,打开【索引/键】对话框。3
15、)单击【索引/键】对话框左下方的【添加】按钮,按钮上方的索引/键列表框中增加一个名为“IX_系部表*”的项,星号表示该名称未确定,用户可对其进行修改。4)在【索引/键】对话框右侧的属性面板中,修改【标识】的【名称】属性项的值,将“IX_系部表”改为“UQ_系部表”。5)修改【常规】属性组中的两个属性项:从【类型】属性右侧的下拉列表中选择“唯一键”,如图6-4所示;单击【列】属性项右侧的按钮,打开如图6-5所示的【索引列】对话框,为唯一约束指定字段名与唯一索引的排序顺序。6)单击【索引/键】对话框右下方的【关闭】按钮。7)执行【文件】|【保存】命令或单击工具栏上的按钮。至此,唯一约束创建完成。图
16、6-4 【索引/键】对话框图6-5 【索引列】对话框2创建表的同时创建唯一约束定义唯一约束的语法格式如下。语法格式1:CREATETABLE表名(列名CONSTRAINT约束名UNIQUECLUSTERED|NONCLUSTERED,n)语法格式2:CREATETABLE表名(CONSTRAINT约束名UNIQUECLUSTERED|NONCLUSTERED(列名1,列名n),n)其中,NONCLUSTERED为默认值。【例6.6】删除系部表,重新创建如表1-10所示带有主键约束和唯一约束完整的系部表。在查询编辑器窗口中执行如下Transact-SQL语句。USE学生成绩GODROPTABLE
17、系部表GOCREATETABLE系部表(系部编号char(2)NOTNULLPRIMARYKEY,系部名称varchar(16)NOTNULLUNIQUE,系部主任varchar(8)NULL)GO3修改表语句创建唯一约束语法格式如下。ALTERTABLE表名ADDCONSTRAINT约束名UNIQUECLUSTERED|NONCLUSTERED(列名1,列名n)【例6.7】为例5.2中创建的“班级表”的“班级名称”列添加唯一约束。在查询编辑器窗口中执行如下Transact-SQL语句。USE学生成绩GOALTERTABLE班级表ADDCONSTRAINTUQ_班级表UNIQUE(班级名称)G
18、O唯一约束的删除同主键约束,这里不再介绍。6.2.4外键约束外键约束(foreignkeyconstraint)强制实现参照完整性,能够在同一个数据库的多个表之间建立关联,并维护表与表之间的依赖关系。外键约束定义一个列或多个列的组合为当前表的外键,该外键值引用其他表中的主键约束所映射列的列值。1使用SSMS创建外键约束【例6.8】在学生成绩数据库中,为班级表添加外键。具体操作步骤如下。1)在【对象资源管理器】窗口中,展开【数据库】|【学生成绩】|【表】|【dbo.班级表】节点。右击【键】节点,在弹出的快捷菜单中执行【新建外键】命令,打开如图6-6所示的【外键关系】对话框。2)单击【表和列规范】
19、属性项右侧的按钮,打开【表和列】对话框。选择系部表作为主键表,其主键为“系部编号”,系统默认选择班级表作为外键表,并将“系部编号”作为外键,如图6-7所示,单击【确定】按钮。图6-6 【外键关系】对话框图6-7 【表和列】对话框3)在【外键关系】对话框中单击【关闭】按钮。然后保存对班级表结构所做的修改,班级表的外键创建成功。刷新学生成绩数据库后,在【对象资源管理器】窗口中,展开【数据库】|【学生成绩】|【表】|【dbo.班级表】|【键】节点,可以看到所创建的外键约束,如图6-8所示。【说明】为确保班级表的外键约束创建成功,先把班级表中的记录清除,因为在第5章中在班级表中插入有记录,而系部表为空
20、,这样如不清除班级表中的记录,创建外键约束时会发生冲突。图6-8 查看班级表外键2使用ALTERTABLE语句定义外键约束语法格式如下:ALTERTABLE外键表名ADDCONSTRAINT外键约束名FOREIGNKEY(列名1,列名2,列名n)REFERENCES主键表名(列名1,列名2,列名n)ONDELETECASCADE|NOACTION|SETNULL|SETDEFAULTONUPDATECASCADE|NOACTION|SETNULL|SETDEFAULT其中,参数说明如下。ONDELETE选项子句用来规定当从主键表中删除记录时,外键表中的记录将执行何种操作。子句各备选项参数意义如
21、下。CASCADE:当从主键表中删除一行记录时,外键表中的相应记录行将被删除。NOACTION:当从主键表中删除一行记录时,外键表不采取任何操作,仅返回删除失败的错误信息,为默认值。SETNULL:当从主键表中删除一行记录时,外键表中相应记录各列被赋予空值。SETDEFAULT:当从主键表中删除一行记录时,外键表中相应记录各列被赋予默认值。ONUPDATE选项子句用来规定当从主键表中更新记录时,外键表中的记录将执行何种操作。各参数的意义与ONDELETE子句相似。【例6.9】在学生成绩数据库中,为成绩表创建外键约束。分析:在表1-12成绩表的结构中,有引用来自“学生信息表”的“学号”和“课程信
22、息表”的“课程编号”两个外键列,可以使用ALTERTABLE语句创建外键约束。在查询编辑器窗口中执行如下Transact-SQL语句。USE学生成绩GOALTERTABLE成绩表ADDCONSTRAINTFK_成绩表_学生信息表FOREIGNKEY(学号)REFERENCES学生信息表(学号)GOALTERTABLE成绩表ADDCONSTRAINTFK_成绩表_课程信息表FOREIGNKEY(课程编号)REFERENCES课程信息表(课程编号)GO3使用数据库关系图创建外键约束【例6.10】在学生成绩数据库中,使用数据库关系图为学生信息表创建外键约束。分析:在表1-8学生信息表的结构中,有引用
23、来自“班级表”的“班级编号”外键列,这里使用数据库关系图为其创建外键约束。具体操作步骤如下。1)在【对象资源管理器】窗口中,展开【数据库】|【学生成绩】节点,右击【数据库关系图】节点,在弹出的快捷菜单中执行【新建数据库关系图】命令,打开如图6-9所示的【添加表】对话框。2)在【添加表】对话框中,单击【添加】按钮把学生成绩数据库中的五张表都添加到数据库关系图中,单击【关闭】按钮。产生如图6-10所示的学生成绩数据库关系图。图6-9 【添加表】对话框图6-10 学生成绩数据库关系图3)在图6-10中可以看到学生成绩数据库中已经建立的外键约束。在学生信息表中选中“班级编号”列,拖动鼠标指针指向班级表
24、中的“班级编号”列,同时弹出【外键关系】和【表和列】两个对话框,分别单击【确定】和【关闭】按钮即可给学生信息表创建外键约束。4)单击工具栏上的按钮,保存数据库关系图,刷新数据库即可查看学生信息表的外键约束。外键约束的删除操作与主键约束相同,这里不再介绍。6.2.5检查约束检查约束(checkconstraint)通过控制列值的范围来实现域完整性。检查约束限制对特定列输入数据的范围或格式,确保该列获得有效值,避免非法数据的产生与扩散。对同一个列可定义多个检查约束。但标识列、ROWGUIDCOL列或数据类型为TIMESTAMP的列不能定义检查约束,因为这几类列的列值由数据库系统自动添加。检查约束的
25、作用类似于外键约束,它们都能限制列的取值范围。但两种约束确定列值是否有效的方法却不相同。检查约束通过指定的逻辑表达式来限制列的取值范围。外键约束则通过其他表来限制列的取值范围。1使用SSMS创建检查约束【例6.11】在学生成绩数据库中,为学生信息表中的“性别”列添加检查约束,要求其取值为“男”或“女”。分析:由于学生信息表已经建立,这里用SSMS修改学生信息表结构,为“性别”列添加检查约束。具体操作步骤如下。1)在【对象资源管理器】窗口中,展开【数据库】|【学生成绩】|【表】|【dbo.学生信息表】节点。右击【约束】节点,在弹出的快捷菜单中执行【新建约束】命令,打开【CHECK约束】对话框。2
26、)修改【标识】的【名称】属性项的值为“CK_学生信息表_性别”;在【常规】的【表达式】属性项中输入“性别=男OR性别=女”,如图6-11所示。3)单击【关闭】按钮。然后保存对学生信息表结构所做的修改,“性别”列上成功创建检查约束。图6-11 【CHECK约束】对话框2使用CREATETABLE语句定义检查约束使用CREATETABLE语句在建表时创建检查约束,其语法格式如下。CREATETABLE表名(列名数据类型CONSTRAINT检查约束名CHECK(),n)【例6.12】在学生成绩数据库中,创建一个表名为“学生成绩表”的新表,其表的结构同表1-12成绩表。分析:表1-12成绩表已经存在,
27、此处为了演示用CREATETABLE语句在建表时创建检查约束,所以新建一个“学生成绩表”,此表在学生成绩数据库中没有意义,本例用完后删除。在查询编辑器窗口中执行如下Transact-SQL语句。CREATETABLE学生成绩表(学号char(8)NOTNULL,课程编号char(4)NOTNULL,成绩decimal(4,1)NULLCHECK(成绩=0AND成绩=100),CONSTRAINTPK_学生成绩表PRIMARYKEY(学号,课程编号),CONSTRAINTFK_学生成绩表_学生信息表FOREIGNKEY(学号)REFERENCES学生信息表(学号),CONSTRAINTFK_学生
28、成绩表_课程信息表FOREIGNKEY(课程编号)REFERENCES课程信息表(课程编号)GO【说明】本例在建表时,同时创建了主键约束(复合主键)、外键约束和检查约束,很具有代表性。前面没有讲用CREATETABLE语句建外键约束,不是不可以,只是更常用ALTERTABLE语句。此处所建“学生成绩表”用完后,要删除,后面不再使用。3使用ALTERTABLE语句定义检查约束其语法格式如下。ALTERTABLE表名WITHCHECK|NOCHECKADDCONSTRAINT检查约束名CHECK()其中,参数说明如下。WITHCHECK:对表中已有记录进行约束检查,此值为默认值。WITHNOCHE
29、CK:对表中已有记录不进行约束检查,只对以后插入的新记录进行检查。【例6.13】在学生成绩数据库中,为课程信息表的“考核类型”列和成绩表的“成绩”列分别添加检查约束。分析:从表1-11课程信息表结构可知,“考核类型”列取值为“考试”或“考查”;从表1-12成绩表结构可知,“成绩”列取值在0100。由于课程信息表和成绩表已经存在,这里用ALTERTABLE语句来实现检查约束的创建。在查询编辑器窗口中执行如下Transact-SQL语句。USE学生成绩GOALTERTABLE课程信息表ADDCONSTRAINTCK_课程信息表_考核类型CHECK(考核类型=考试OR考核类型=考查)GOALTERT
30、ABLE成绩表ADDCONSTRAINTCK_成绩表_成绩CHECK(成绩=0AND成绩=100)GO4删除检查约束(1)使用SSMS删除在【对象资源管理器】窗口中,展开【数据库】|【学生成绩】|【表】|【要删除约束的表】|【约束】节点,右击【检查约束名】,在弹出的快捷菜单中执行【删除】命令即可。(2)使用Transact-SQL语句删除检查约束的语法格式与删除主键约束相同。6.2.6默认值约束默认值约束(DefaultConstraint)用于确保域完整性,它提供了一种为数据表中的任何一列提供默认值的手段。默认值是指使用INSERT语句向数据表中插入数据时,如果没有为某一列指定数据,默认值约
31、束提供随新记录一起存储到数据表中该列的默认值。在使用默认值约束时,用户需注意以下几点。默认值约束只能应用于INSERT语句,且定义的值必须与该列的数据类型和精度一致。在每一列上只能有一个默认值约束。默认值约束不能定义在指定IDENTITY属性或数据类型为timestamp的列上。默认值约束允许使用一些系统函数提供的值。1使用SSMS创建默认值约束【例6.14】在学生成绩数据库的学生信息表中,为“族别”列添加默认值“汉族”。具体操作步骤如下。1)在【对象资源管理器】窗口中,展开【数据库】|【学生成绩】|【表】节点。右击【dbo.学生信息表】节点,在弹出的快捷菜单中执行【设计】命令,打开表设计器。
32、2)将光标定位到“族别”字段。在【列属性】区域的【默认值或绑定】栏中输入“汉族”,如图6-12所示。3)单击工具栏上的保存按钮,保存设置。图6-12 创建默认值约束2使用CREATETABLE语句创建默认值约束语法格式如下。CREATETABLE表名(列名数据类型CONSTRAINT默认值约束名DEFAULT,.n)【例6.15】在学生成绩数据库中,新建一个Students表,其中包含学号、姓名和族别三个字段,族别有默认值“汉族”。分析:本例为了演示在建表的同时创建默认值约束,所建的Students表在学生成绩数据库中没有用,用完要删除。在查询编辑器窗口中执行如下Transact-SQL语句。
33、USE学生成绩GOCREATETABLEStudents(学号Char(8)NOTNULLPRIMARYKEY,姓名Varchar(12)NOTNULL,族别Varchar(8)NOTNULLDEFAULT汉族)GO3使用ALTERTABLE语句添加默认值约束语法格式如下。ALTERTABLE表名ADDCONSTRAINT默认值约束名DEFAULT()FOR列名【例6.16】在学生成绩数据库的学生信息表中,为“族别”列添加默认值“汉族”。分析:在例6.14已经为学生信息表中的“族别”列添加默认值。先删除再使用ALTERTABLE语句完成任务。在查询编辑器窗口中执行如下Transact-SQL语
34、句。USE学生成绩GOALTERTABLE学生信息表ADDCONSTRAINTDF_学生信息表_族别DEFAULT汉族FOR族别GO6.2.7非空约束非空约束(notnullconstraint)用来实现域完整性,指定特定列的值不允许为空,即让该列拒绝接受空值。1使用SSMS创建非空约束使用SSMS创建非空约束比较简单,设计表时,在表设计器中,选中需要设置非空约束的列,在【允许Null值】列选择不允许该字段为空值,即复选框不被选中。2使用CREATETABLE语句创建非空约束语法格式如下。CREATETABLE表名(列名数据类型CONSTRAINT非空约束名NULL|NOTNULL,.n)3A
35、LTERTABLE语句添加非空约束语法格式如下。ALTERTABLE表名ALTERCOLUMN列名数据类型NULL|NOTNULL6.3使用IDENTITY列6.3.1建立IDENTITY列1使用SSMS创建IDENTITY列【例6.17】在学生成绩数据库中,新建一名为“New_系部表”的表,其表结构如表6-2所示。列列 名名数数 据据 类类 型型宽宽 度度为为 空空 性性说说 明明系部编号Int00主关键字,自动编号系部名称Varchar16取值唯一系部主任Varchar08表表6-2 New_系部表系部表具体操作步骤如下。1)在【对象资源管理器】窗口中,展开【数据库】|【学生成绩】节点。右
36、击【表】节点,在弹出的快捷菜单中执行【新建表】命令,打开表设计器。2)按照前面介绍的方法输入各列,设置相关属性,建立主键和唯一约束。这里重点介绍如何设置“系部编号”的自动编号。3)把光标定位到系部编号列,在【列属性】区域展开【标识规范】,设置【(是标识)】的属性值为“是”,【标识增量】属性值为1,【标识种子】属性值为1,如图6-13所示。4)单击工具栏上的保存按钮,在弹出的【选择名称】对话框中,输入新表名“New_系部表”,单击【确定】按钮即可。图6-13 设置IDENTITY列2使用CREATETABEL语句创建IDENTITY列语法格式如下。CREATETABLE表名(列名数据类型IDEN
37、TITY(seed,increment),.n)其中,参数说明如下。数据类型:必须是整型数据类型或decimal和numeric。Seed:装载到表中的第一行所使用的值,又称标识种子,默认值为1。Increment:增量值,该值被添加到前一个已装载的行的标识值上,默认值为1。【例6.18】在学生成绩数据库中,新建一名为“New_成绩表”的表,其表结构如表6-3所示。列列 名名数数 据据 类类 型型宽宽 度度为为 空空 性性说说 明明序号(ID)Int0主关键字,自动编号学号Char8课程编号Char4成绩Decimal(4,1)取值在0100表表6-3 New_成绩表成绩表在查询编辑器窗口中执
38、行如下Transact-SQL语句。USE学生成绩GOCREATETABLENew_成绩表(序号(ID)IntNOTNULLPRIMARYKEYIDENTITY(1,1),学号Char(8)NOTNULL,课程编号Char(4)NOTNULL,成绩Decimal(4,1)CHECK(成绩=0AND成绩=100)GO3使用ALTERTABEL语句添加IDENTITY列语法格式如下。ALTERTABLE表名ADD列名数据类型IDENTITY(seed,increment)【例6.19】在学生成绩数据库的New_成绩表中,先删除例6.18中建的标识列“序号(ID)”,再新增一个名为“成绩序号(ID)
39、”的标识列,种子为1,增量为2。分析:在例6.18建标识列“序号(ID)”的同时定义了主键约束,要删除该列,得先删除该列上的主键,先在【对象资源管理器】中,查看一下该表主键的名称,该名称为系统自动生成。在查询编辑器窗口中执行如下Transact-SQL语句:USE学生成绩GOALTERTABLENew_成绩表DROPCONSTRAINTPK_New_成绩表_5B9C8F9E619B8048GOALTERTABLENew_成绩表DROPCOLUMN序号(ID)GOALTERTABLENew_成绩表ADD成绩序号(ID)IntIDENTITY(1,2)GO6.3.2使用IDENTITY列【例6.2
40、0】在学生成绩数据库的New_系部表中,插入三条记录,并查询插入记录后的New_系部表。在查询编辑器窗口中执行如下Transact-SQL语句。USE学生成绩GOINSERTINTONew_系部表(系部名称,系部主任)VALUES(信息工程系,张岚)INSERTINTONew_系部表(系部名称,系部主任)VALUES(生物工程系,赵晓红)INSERTINTONew_系部表(系部名称,系部主任)VALUES(工程技术系,王江林)GOSELECT*FROMNew_系部表GO运行结果如图6-14所示。图6-14 在New_系部表中使用IDENTITY列【说明】如果经常进行删除记录操作的表中存在IDE
41、NTITY列,那么在标识值之间可能会产生差距。如果这构成了问题,那么请不要使用IDENTITY属性。但是,为了确保不产生差距,或为了弥补现有的差距,在用“SETIDENTITY_INSERT表名ON”设置显式地输入标识值之前,请先对现有的标识值进行计算。6.4默认值和规则6.4.1默认值与默认值约束类似,默认值(default)的作用也是当用户向数据表中插入数据行时,如果没有为某列输入值,则由SQLServer自动为该列赋予默认值。与默认值约束不同的是,默认值是一种数据库对象。使用默认值对象的方法:使用CREATEDEFAULT语句创建默认值对象。使用系统存储过程sp_bindefault将其
42、绑定到列上。1创建默认值对象创建默认值对象的语法格式如下。CREATEDEFAULTdefault_nameASconstant_expression其中,default_name为默认值对象名称;constant_expression为只包含常量值的表达式。2默认值绑定系统存储过程sp_bindefault用于将默认值绑定到列或用户定义的数据类型,它的语法格式如下。sp_bindefaultdefault_name,object_name,futureonly_flag其中,各参数的含义如下。object_name:为被绑定默认值的列名或用户定义的数据类型。futureonly_flag:仅
43、当将默认值绑定到用户定义数据类型时才能使用。当此参数设置为futureonly时,该数据类型的现有列无法继承新默认值。如果futureonly_flag为NULL,则新默认值将绑定到用户定义数据类型的所有列。默认值为NULL。【例6.21】在学生成绩数据库中,创建一个默认值对象“DF_族别”,值为“汉族”,并将其绑定到学生信息表的“族别”列。在查询编辑器窗口中执行如下Transact-SQL语句。USE学生成绩GO-创建默认值对象CREATEDEFAULTDF_族别AS汉族GO-绑定默认值对象EXECsp_bindefaultDF_族别,学生信息表.族别GO【说明】默认值约束和默认值对象不能同
44、时在某个列上使用,本例在学生信息表的“族别”列绑定默认值对象“DF_族别”时,必须先把例6.16中“族别”列上的默认值约束删除。默认值对象可以多次绑定到多个不同的列上,本例中默认值对象“DF_族别”仅使用了一次,不能很好地体现默认值对象较默认值约束的优势,这里只是简单说明默认值的使用。【例6.22】使用SSMS工具查看默认值对象“DF_族别”和学生信息表的“族别”列的绑定情况。具体操作步骤如下。1)启动SSMS。2)在【对象资源管理器】窗口中,展开【数据库】|【学生成绩】|【可编程性】|【默认值】节点,可以看到定义的默认值对象“DF_族别”。3)展开【表】|【学生信息表】|【列】节点,右击【族
45、别】列,在弹出的快捷菜单中执行【属性】命令,打开【列属性】对话框如图6-15所示,在【默认值绑定】单元格中显示绑定到“DF_族别”默认值。图6-15 显示绑定默认值对象3默认值删除删除默认值对象的正确方法:首先解除所有的绑定,然后再删除默认值对象。解除绑定到列或用户定义的数据类型的默认值对象的语法格式如下。sp_unbindefaultobject_name,futureonly_flag其中,futureonly_flag仅在解除用户自定义数据类型的默认值绑定时使用。默认值为NULL。当futureonly_flag的数据类型为futureonly时,该数据类型的现有列不会失去指定默认值。删
46、除默认值对象的语法格式如下。DROPDEFAULTdefault_name,.n【例6.23】删除默认值对象“DF_族别”。执行如下Transact-SQL语句。-解除绑定EXECsp_unbindefault学生信息表.族别GO-删除默认值对象DROPDEFAULTDF_族别GO运行结果如图6-16所示。图6-16 删除默认值对象6.4.2规则规则(rule)就是对存储在表中列或用户自定义数据类型的取值范围的规定或限制。规则是一种数据库对象。规则和约束可以同时使用,表中的列可以有一个规则及多个CHECK约束,规则与CHECK约束很相似。相比之下,使用在ALTERTABLE或CREATETAB
47、LE命令中的CHECK约束是更标准的限制列值的方法,但CHECK约束不能直接作用于用户自定义数据类型。1创建规则语法格式如下。CREATERULErule_nameAScondition_expression其中,rule_name为规则名称。condition_expression是规则的定义,可以是用于WHERE条件子句中的任何表达式。2规则的绑定使用系统存储过程sp_bindrule将规则绑定到列或用户定义的数据类型。它的语法格式如下。sp_bindrulerule_name,object_name,futureonly_flag其中,各参数的含义如下。object_name:要绑定规则
48、的列名或用户自定义数据类型。futureonly_flag:仅当将规则绑定到用户自定义数据类型时才能使用。当此参数设置为futureonly时,可以防止具有用户自定义类型的现有列继承新的规则。如果futureonly_flag为NULL,则会将新规则绑定到所有用户自定义数据类型列上。默认值为NULL。【例6.24】在学生成绩数据库中,创建一个规则“RL_性别”,使其取值为“男”或者“女”,并将其绑定到学生信息表的“性别”列。在查询编辑器窗口中执行如下Transact-SQL语句。USE学生成绩GO-创建规则CREATERULERL_性别ASxb=男ORxb=女GO-绑定规则EXECsp_bin
49、druleRL_性别,学生信息表.性别GO【说明】在创建规则时,可以使用任何名称或符号表示值,但第一个字符必须是符号,本例用的是xb。在学生信息表的“性别”列上,既有CHECK约束“CK_学生信息表_性别”,又绑定了规则“RL_性别”,可见规则可以和CHECK约束共同作用于某一列。【例6.25】使用SSMS工具查看规则“RL_性别”和学生信息表的“性别”列的绑定情况。具体操作步骤如下。1)在【对象资源管理器】窗口中,展开【数据库】|【学生成绩】|【可编程性】|【规则】节点,可以看到定义的规则“RL_性别”。2)展开【表】|【学生信息表】|【列】节点,右击【性别】列,在弹出的快捷菜单中执行【属性
50、】命令,打开【列属性】对话框如图6-17所示,在【规则】单元格中显示绑定到“RL_性别”规则。图6-17 显示绑定规则对象3规则的删除删除规则同删除默认值对象类似。需要先解除绑定才能删除规则。解除规则绑定的语法格式如下。sp_unbindruleobject_name,futureonly_flag其中,futureonly_flag仅在取消用户自定义数据类型的规则绑定时使用。当futureonly_flag的数据类型为futureonly时,该数据类型的现有列不会失去指定的规则。默认值为NULL。删除规则的语法格式如下。DROPRULErule_name,.n【例6.26】删除“RL_性别”
51、规则。在查询编辑器窗口中执行如下Transact-SQL语句。USE学生成绩GO-解除绑定EXECsp_unbindrule学生信息表.性别GO-删除规则DROPRULERL_性别GO实训6【实训项目】酒店管理数据库(HOTEL)中数据完整性的实现。【实训目的】1理解完整性的概念、类型及作用。2掌握数据表的约束的使用。【实训环境】Windows2000Server或WindowsXP或Windows7操作系统和SQLServer2008数据库服务器。【实训内容】1使用SSMS在酒店管理信息系统HOTEL数据库中,为实训5所建的Client表和RoomType表设置主键约束,约束情况见表5-1和
52、表5-2。2在酒店管理信息系统HOTEL数据库中,删除实训5所建的Room表,重新使用Transact-SQL语句建立带有主键约束和外键约束的Room表,约束情况见表5-3。3在酒店管理信息系统HOTEL数据库中,使用Transact-SQL语句修改ClientRecord表,为其添加主键约束和外键约束,约束情况见表5-4。4分别使用SSMS和Transact-SQL语句为Client表的Sex列添加检查约束,约束情况见表5-1。5分别使用SSMS和Transact-SQL语句为ClientRecord表的InDate列添加默认值,约束情况见表5-4。6在每张表中添加至少2条符合实际意义的数据,检验约束的作用。谢谢,再见!谢谢,再见!