第6章数据完整性控制.ppt

上传人:sccc 文档编号:6154185 上传时间:2023-09-30 格式:PPT 页数:87 大小:4.36MB
返回 下载 相关 举报
第6章数据完整性控制.ppt_第1页
第1页 / 共87页
第6章数据完整性控制.ppt_第2页
第2页 / 共87页
第6章数据完整性控制.ppt_第3页
第3页 / 共87页
第6章数据完整性控制.ppt_第4页
第4页 / 共87页
第6章数据完整性控制.ppt_第5页
第5页 / 共87页
点击查看更多>>
资源描述

《第6章数据完整性控制.ppt》由会员分享,可在线阅读,更多相关《第6章数据完整性控制.ppt(87页珍藏版)》请在三一办公上搜索。

1、第6章 数据完整性控制,本章学习目标,通过本章的学习,达到以下目标:理解数据完整性的概念、类型及实现方式。掌握使用约束来实现数据完整性。掌握使用IDENTITY列实现数据完整性。掌握使用默认值对象和规则实现数据完整性。,本章目录,6.1 数据完整性概述,6.1.1 数据完整性定义,数据完整性是指数据的精确性和可靠性,主要用于保证数据库中数据的质量。它是为防止数据库中存在不符合语义规定的数据和防止因错误信息的输入/输出造成无效操作或报错而提出的。,6.1.2 数据完整性类型,实体完整性实体完整性,又称行完整性,用于保证表中的每一行数据在表中是唯一的。保证实体完整性的措施:PRIMARY KEY约

2、束、UNIQUE约束或IDENTITY列。域完整性域完整性,又称列完整性,是指数据表特定列输入的有效性。用来保证列值的有效性与正确性。保证域完整性的措施:限制数据的类型或格式、CHECK约束、DEFAULT约束、NOT NULL约束或规则。参照完整性参照完整性,又称引用完整性,是建立在外键与主键或外键与唯一键之间的一种引用规则。保证参照完整性的措施有FOREIGN KEY约束。用户定义完整性用户定义的不属于其他任何完整性类别的特定业务规则,称为用户定义完整性。所有完整性类别都支持用户定义完整性。,6.1.3 实现数据完整性的方式,SQL Server 2008中采用两种方式实现数据完整性。1声

3、明数据完整性声明数据完整性是通过在数据库中定义一系列的数据约束与验证标准,并由数据库系统自身在插入、修改、删除数据时自动实施这些标准的一种数据完整性实现手段。声明数据完整性主要通过定义与使用约束、默认值与规则来实现。2过程数据完整性过程数据完整性是通过在脚本语言中定义一系列的数据约束与验证标准,并在脚本执行过程中强制完成这些标准的检验。过程数据完整性主要通过定义与使用视图、触发器和存储过程来实现。本章仅介绍声明数据完整性的实现方法与技术。,6.2 使用约束实现数据完整性,6.2.1 约束概述,1约束定义约束(constraint)是SQL Server 2008提供的自动保持数据库完整性的一种

4、方法。约束就是限制,定义约束就是定义可输入表或表的单个列中的数据的限制条件。2约束分类在SQL Server中有6种约束:主键约束(primary key constraint)唯一约束(unique constraint)外键约束(foreign key constraint)检查约束(check constraint)默认约束(default constraint)非空约束(not null constraint),约束与完整性之间的关系,3约束名在创建约束时,需要创建约束的名称,约束名称必须符合标识符命名规则。建议使用约束类型和其完成任务的从句组合作为约束名。例如,学生信息表的主键使用P

5、K_学生信息表。4创建约束的语法格式(1)使用CREATE TABLE语句创建约束其语法格式如下:CREATE TABLE 表名(,|)其中,参数说明如下。表名:是合法标识符,最多可有128个字符。:,(2)使用ALTER TABLE语句创建约束其语法格式如下:ALTER TABLE 表名ADD在SQL Server中对基本表的约束分为:列约束:是对某一个特定列的约束,包含在列定义中,直接跟在该列的其他定义之后,用空格分隔,不必指定列名。表约束:与列定义相互独立,不包括在列定义中,通常用于对多个列一起进行约束,与列定义用“,”分隔,定义表约束时必须指出要约束的那些列的名称。,6.2.2 主键约

6、束,主键约束(primary key constraint)用于指定表的一列或几列的组合来唯一标识表,即能在表中唯一地指定一行记录,这样的一列或列的组合称为表的主键(primary key,PK)。定义主键约束的列其值不可为空、不可重复。每个表中只能有一个主键。1使用SSMS创建主键约束【例6.1】在学生成绩数据库中,创建第1章中设计的系部表,表的结构如表1-10所示。分析:在例5.2中已经创建系部表,但是没有设置主键约束,且已经在例5.12中删除,在此利用SSMS重新创建具有主键约束的系部表。,具体操作步骤如下:1)启动SSMS。2)在【对象资源管理器】窗口中,展开【数据库】|【学生成绩】|

7、【表】节点。右击【表】节点,在弹出的快捷菜单窗口中执行【新建表】命令,打开表设计器。3)在表设计器中,在【列名】单元格输入字段名“系部编号”,在同一行的【数据类型】单元格设置该字段的数据类型为char(2),并在【允许Null值】列选择不允许该字段为空值。4)重复步骤(3)设置“系部名称”、“系部主任”列。5)将光标定位在“系部编号”行。6)单击SSMS工具栏上的 按钮设置主键,“系部编号”行显示一个钥匙图标,如图6-3所示。7)执行【文件】|【保存】命令或单击工具栏上的保存按钮,在打开的对话框中输入表名称“系部表”,单击【确定】按钮保存表。,图6-3 系部表结构,2在创建表的同时创建主键约束

8、1)创建单个列的主键可采用列级约束,它的语法格式如下。CREATE TABLE表名(列名CONSTRAINT约束名PRIMARY KEYCLUSTERED|NONCLUSTERED,n)2)多个列组合的主键约束,采用表级约束,它的语法格式如下。CREATE TABLE 表名(CONSTRAINT 约束名 PRIMARY KEY CLUSTERED|NONCLUSTERED(列名1,列名n),n)其中,CLUSTERED为默认值,表示创建聚集索引,NONCLUSTERED表示创建非聚集索引。,【例6.2】在学生成绩数据库中,创建如表1-11所示的课程信息表。在查询编辑器窗口中执行如下Transa

9、ct-SQL语句:USE 学生成绩GOCREATE TABLE 课程信息表(课程编号 char(4)NOT NULL PRIMARY KEY,课程名称 varchar(30)NOT NULL,学分 decimal(3,1)NULL,学时 int NULL,考核类型 char(4)NULL)GO,【说明】列约束包含在列定义中,直接跟在该列的其他定义之后,用空格分隔,不必指定约束名,系统自动给定约束名。,【例6.3】在学生成绩数据库中,创建如表1-12所示的成绩表。分析:由于创建的是组合主键约束,所以只能采用表级约束。在查询编辑器窗口中执行如下Transact-SQL语句。USE 学生成绩GOCR

10、EATE TABLE 成绩表(CONSTRAINT PK_成绩表 PRIMARY KEY(学号,课程编号),学号 char(8)NOT NULL,课程编号 char(4)NOT NULL,成绩 decimal(4,1)NULL)GO,【说明】创建多个列组合的约束(如组合主键)时,只能将其定义为表级约束。定义时必须指出要约束的那些列的名称,与列定义用“,”分隔。,3在一张现有表上添加主键约束(1)使用SSMS添加主键约束在【对象资源管理器】窗口中,右击要添加主键约束的表,在弹出的快捷菜单中执行【设计】命令,利用表设计器添加主键约束。(2)利用ALTER TABLE语句它的语法格式如下:ALTER

11、 TABLE表名ADD CONSTRAIN 约束名 PRIMARY KEY CLUSTERED|NONCLUSTERED(列名1,列名n),【例6.4】为例5.1和例5.2中创建的“学生信息表”和“班级表”添加主键约束。分析:在例5.1和例5.2中创建的“学生信息表”和“班级表”不带主键约束,在此添加约束,修改表定义,使用ALTER TABLE语句。在查询编辑器窗口中执行如下Transact-SQL语句。USE 学生成绩GOALTER TABLE 学生信息表ADD CONSTRAINT PK_学生信息表 PRIMARY KEY(学号)GOALTER TABLE 班级表ADD CONSTRAIN

12、T PK_班级表 PRIMARY KEY(班级编号)GO,4删除主键约束(1)使用SSMS删除在【对象资源管理器】中,展开【数据库】|【学生成绩】|【表】|【要删除约束的表】|【键】节点,右击【主键约束名】,在弹出的快捷菜单中执行【删除】命令即可。(2)使用Transact-SQL语句删除约束的语法格式如下。ALTER TABLE表名DROP CONSTRAINT 约束名1,约束名n,6.2.3 唯一约束,唯一约束(unique constraint)用于指定非主键的一个列或多个列的组合值具有唯一性,以防止在列中输入重复的值,也就是说如果一个数据表已经设置了主键约束,但该表中还包含其他的非主键

13、列,也必须具有唯一性,为避免该列中的值出现重复输入的情况,必须使用唯一约束(一个数据表不能包含两个或两个以上的主键约束)。唯一约束与主键约束的区别如下:唯一约束指定的列可以为NULL,但主键约束所在的列则不允许为NULL。一个表中可以包含多个唯一约束,而主键约束则只能有一个。,1使用SSMS创建唯一约束【例6.5】为例6.1中创建的“系部表”的“系部名称”列设置唯一约束。具体操作步骤如下。1)在【对象资源管理器】窗口中,展开【数据库】|【学生成绩】|【表】节点。右击【dbo.系部表】节点,在弹出的快捷菜单中执行【设计】命令,打开表设计器。2)在表设计器中,将光标定位在“系部名称”行,右击,在弹

14、出的快捷菜单中执行【索引/键】命令,打开【索引/键】对话框。3)单击【索引/键】对话框左下方的【添加】按钮,按钮上方的索引/键列表框中增加一个名为“IX_系部表*”的项,星号表示该名称未确定,用户可对其进行修改。,4)在【索引/键】对话框右侧的属性面板中,修改【标识】的【名称】属性项的值,将“IX_系部表”改为“UQ_系部表”。5)修改【常规】属性组中的两个属性项:从【类型】属性右侧的下拉列表中选择“唯一键”,如图6-4所示;单击【列】属性项右侧的 按钮,打开如图6-5所示的【索引列】对话框,为唯一约束指定字段名与唯一索引的排序顺序。6)单击【索引/键】对话框右下方的【关闭】按钮。7)执行【文

15、件】|【保存】命令或单击工具栏上的 按钮。至此,唯一约束创建完成。,图6-4【索引/键】对话框,图6-5【索引列】对话框,2创建表的同时创建唯一约束定义唯一约束的语法格式如下。语法格式1:CREATE TABLE 表名(列名 CONSTRAINT约束名 UNIQUECLUSTERED|NONCLUSTERED,n)语法格式2:CREATE TABLE 表名(CONSTRAINT 约束名 UNIQUE CLUSTERED|NONCLUSTERED(列名1,列名n),n)其中,NONCLUSTERED为默认值。,【例6.6】删除系部表,重新创建如表1-10所示带有主键约束和唯一约束完整的系部表。在

16、查询编辑器窗口中执行如下Transact-SQL语句。USE 学生成绩GODROP TABLE 系部表GOCREATE TABLE 系部表(系部编号 char(2)NOT NULL PRIMARY KEY,系部名称 varchar(16)NOT NULL UNIQUE,系部主任 varchar(8)NULL)GO,3修改表语句创建唯一约束语法格式如下。ALTER TABLE表名ADD CONSTRAINT 约束名UNIQUE CLUSTERED|NONCLUSTERED(列名1,列名n)【例6.7】为例5.2中创建的“班级表”的“班级名称”列添加唯一约束。在查询编辑器窗口中执行如下Transa

17、ct-SQL语句。USE 学生成绩GOALTER TABLE 班级表ADD CONSTRAINT UQ_班级表 UNIQUE(班级名称)GO唯一约束的删除同主键约束,这里不再介绍。,6.2.4 外键约束,外键约束(foreign key constraint)强制实现参照完整性,能够在同一个数据库的多个表之间建立关联,并维护表与表之间的依赖关系。外键约束定义一个列或多个列的组合为当前表的外键,该外键值引用其他表中的主键约束所映射列的列值。1使用SSMS创建外键约束【例6.8】在学生成绩数据库中,为班级表添加外键。具体操作步骤如下。1)在【对象资源管理器】窗口中,展开【数据库】|【学生成绩】|【

18、表】|【dbo.班级表】节点。右击【键】节点,在弹出的快捷菜单中执行【新建外键】命令,打开如图6-6所示的【外键关系】对话框。2)单击【表和列规范】属性项右侧的 按钮,打开【表和列】对话框。选择系部表作为主键表,其主键为“系部编号”,系统默认选择班级表作为外键表,并将“系部编号”作为外键,如图6-7所示,单击【确定】按钮。,图6-6【外键关系】对话框,图6-7【表和列】对话框,3)在【外键关系】对话框中单击【关闭】按钮。然后保存对班级表结构所做的修改,班级表的外键创建成功。刷新学生成绩数据库后,在【对象资源管理器】窗口中,展开【数据库】|【学生成绩】|【表】|【dbo.班级表】|【键】节点,可

19、以看到所创建的外键约束,如图6-8所示。【说明】为确保班级表的外键约束创建成功,先把班级表中的记录清除,因为在第5章中在班级表中插入有记录,而系部表为空,这样如不清除班级表中的记录,创建外键约束时会发生冲突。,图6-8 查看班级表外键,2使用ALTER TABLE语句定义外键约束语法格式如下:ALTER TABLE 外键表名ADD CONSTRAINT 外键约束名 FOREIGN KEY(列名1,列名2,列名n)REFERENCES 主键表名(列名1,列名2,列名n)ON DELETE CASCADE|NO ACTION|SET NULL|SET DEFAULT ON UPDATE CASCA

20、DE|NO ACTION|SET NULL|SET DEFAULT,其中,参数说明如下。ON DELETE选项子句用来规定当从主键表中删除记录时,外键表中的记录将执行何种操作。子句各备选项参数意义如下。CASCADE:当从主键表中删除一行记录时,外键表中的相应记录行将被删除。NO ACTION:当从主键表中删除一行记录时,外键表不采取任何操作,仅返回删除失败的错误信息,为默认值。SET NULL:当从主键表中删除一行记录时,外键表中相应记录各列被赋予空值。SET DEFAULT:当从主键表中删除一行记录时,外键表中相应记录各列被赋予默认值。ON UPDATE选项子句用来规定当从主键表中更新记录

21、时,外键表中的记录将执行何种操作。各参数的意义与ON DELETE子句相似。,【例6.9】在学生成绩数据库中,为成绩表创建外键约束。分析:在表1-12成绩表的结构中,有引用来自“学生信息表”的“学号”和“课程信息表”的“课程编号”两个外键列,可以使用ALTER TABLE语句创建外键约束。在查询编辑器窗口中执行如下Transact-SQL语句。USE 学生成绩GOALTER TABLE 成绩表ADD CONSTRAINT FK_成绩表_学生信息表FOREIGN KEY(学号)REFERENCES 学生信息表(学号)GOALTER TABLE 成绩表ADD CONSTRAINT FK_成绩表_课

22、程信息表FOREIGN KEY(课程编号)REFERENCES 课程信息表(课程编号)GO,3使用数据库关系图创建外键约束【例6.10】在学生成绩数据库中,使用数据库关系图为学生信息表创建外键约束。分析:在表1-8学生信息表的结构中,有引用来自“班级表”的“班级编号”外键列,这里使用数据库关系图为其创建外键约束。具体操作步骤如下。1)在【对象资源管理器】窗口中,展开【数据库】|【学生成绩】节点,右击【数据库关系图】节点,在弹出的快捷菜单中执行【新建数据库关系图】命令,打开如图6-9所示的【添加表】对话框。2)在【添加表】对话框中,单击【添加】按钮把学生成绩数据库中的五张表都添加到数据库关系图中

23、,单击【关闭】按钮。产生如图6-10所示的学生成绩数据库关系图。,图6-9【添加表】对话框,图6-10 学生成绩数据库关系图,3)在图6-10中可以看到学生成绩数据库中已经建立的外键约束。在学生信息表中选中“班级编号”列,拖动鼠标指针指向班级表中的“班级编号”列,同时弹出【外键关系】和【表和列】两个对话框,分别单击【确定】和【关闭】按钮即可给学生信息表创建外键约束。4)单击工具栏上的 按钮,保存数据库关系图,刷新数据库即可查看学生信息表的外键约束。外键约束的删除操作与主键约束相同,这里不再介绍。,6.2.5 检查约束,检查约束(check constraint)通过控制列值的范围来实现域完整性

24、。检查约束限制对特定列输入数据的范围或格式,确保该列获得有效值,避免非法数据的产生与扩散。对同一个列可定义多个检查约束。但标识列、ROWGUIDCOL列或数据类型为TIMESTAMP的列不能定义检查约束,因为这几类列的列值由数据库系统自动添加。检查约束的作用类似于外键约束,它们都能限制列的取值范围。但两种约束确定列值是否有效的方法却不相同。检查约束通过指定的逻辑表达式来限制列的取值范围。外键约束则通过其他表来限制列的取值范围。,1使用SSMS创建检查约束【例6.11】在学生成绩数据库中,为学生信息表中的“性别”列添加检查约束,要求其取值为“男”或“女”。分析:由于学生信息表已经建立,这里用SS

25、MS修改学生信息表结构,为“性别”列添加检查约束。具体操作步骤如下。1)在【对象资源管理器】窗口中,展开【数据库】|【学生成绩】|【表】|【dbo.学生信息表】节点。右击【约束】节点,在弹出的快捷菜单中执行【新建约束】命令,打开【CHECK约束】对话框。2)修改【标识】的【名称】属性项的值为“CK_学生信息表_性别”;在【常规】的【表达式】属性项中输入“性别=男 OR 性别=女”,如图6-11所示。3)单击【关闭】按钮。然后保存对学生信息表结构所做的修改,“性别”列上成功创建检查约束。,图6-11【CHECK约束】对话框,2使用CREATE TABLE语句定义检查约束使用CREATE TABL

26、E语句在建表时创建检查约束,其语法格式如下。CREATE TABLE 表名(列名 数据类型 CONSTRAINT 检查约束名 CHECK(),n)【例6.12】在学生成绩数据库中,创建一个表名为“学生成绩表”的新表,其表的结构同表1-12成绩表。分析:表1-12成绩表已经存在,此处为了演示用CREATE TABLE语句在建表时创建检查约束,所以新建一个“学生成绩表”,此表在学生成绩数据库中没有意义,本例用完后删除。在查询编辑器窗口中执行如下Transact-SQL语句。,CREATE TABLE 学生成绩表(学号 char(8)NOT NULL,课程编号 char(4)NOT NULL,成绩

27、decimal(4,1)NULL CHECK(成绩=0 AND 成绩=100),CONSTRAINT PK_学生成绩表PRIMARY KEY(学号,课程编号),CONSTRAINT FK_学生成绩表_学生信息表FOREIGN KEY(学号)REFERENCES 学生信息表(学号),CONSTRAINT FK_学生成绩表_课程信息表FOREIGN KEY(课程编号)REFERENCES 课程信息表(课程编号)GO,【说明】本例在建表时,同时创建了主键约束(复合主键)、外键约束和检查约束,很具有代表性。前面没有讲用CREATE TABLE语句建外键约束,不是不可以,只是更常用ALTER TABLE

28、语句。此处所建“学生成绩表”用完后,要删除,后面不再使用。3使用ALTER TABLE语句定义检查约束其语法格式如下。ALTER TABLE表名 WITH CHECK|NOCHECK ADD CONSTRAINT 检查约束名 CHECK()其中,参数说明如下。WITH CHECK:对表中已有记录进行约束检查,此值为默认值。WITH NOCHECK:对表中已有记录不进行约束检查,只对以后插入的新记录进行检查。,【例6.13】在学生成绩数据库中,为课程信息表的“考核类型”列和成绩表的“成绩”列分别添加检查约束。分析:从表1-11课程信息表结构可知,“考核类型”列取值为“考试”或“考查”;从表1-1

29、2成绩表结构可知,“成绩”列取值在0100。由于课程信息表和成绩表已经存在,这里用ALTER TABLE语句来实现检查约束的创建。在查询编辑器窗口中执行如下Transact-SQL语句。,USE 学生成绩GOALTER TABLE 课程信息表ADD CONSTRAINT CK_课程信息表_考核类型CHECK(考核类型=考试 OR 考核类型=考查)GOALTER TABLE 成绩表ADD CONSTRAINT CK_成绩表_成绩CHECK(成绩=0 AND 成绩=100)GO,4删除检查约束(1)使用SSMS删除在【对象资源管理器】窗口中,展开【数据库】|【学生成绩】|【表】|【要删除约束的表】

30、|【约束】节点,右击【检查约束名】,在弹出的快捷菜单中执行【删除】命令即可。(2)使用Transact-SQL语句删除检查约束的语法格式与删除主键约束相同。,6.2.6 默认值约束默认值约束(Default Constraint)用于确保域完整性,它提供了一种为数据表中的任何一列提供默认值的手段。默认值是指使用INSERT语句向数据表中插入数据时,如果没有为某一列指定数据,默认值约束提供随新记录一起存储到数据表中该列的默认值。在使用默认值约束时,用户需注意以下几点。默认值约束只能应用于INSERT语句,且定义的值必须与该列的数据类型和精度一致。在每一列上只能有一个默认值约束。默认值约束不能定义

31、在指定IDENTITY属性或数据类型为timestamp的列上。默认值约束允许使用一些系统函数提供的值。,1使用SSMS创建默认值约束【例6.14】在学生成绩数据库的学生信息表中,为“族别”列添加默认值“汉族”。具体操作步骤如下。1)在【对象资源管理器】窗口中,展开【数据库】|【学生成绩】|【表】节点。右击【dbo.学生信息表】节点,在弹出的快捷菜单中执行【设计】命令,打开表设计器。2)将光标定位到“族别”字段。在【列属性】区域的【默认值或绑定】栏中输入“汉族”,如图6-12所示。3)单击工具栏上的保存按钮,保存设置。,图6-12 创建默认值约束,2使用CREATE TABLE语句创建默认值约

32、束 语法格式如下。CREATE TABLE 表名(列名 数据类型 CONSTRAINT 默认值约束名 DEFAULT,.n)【例6.15】在学生成绩数据库中,新建一个Students表,其中包含学号、姓名和族别三个字段,族别有默认值“汉族”。分析:本例为了演示在建表的同时创建默认值约束,所建的Students表在学生成绩数据库中没有用,用完要删除。在查询编辑器窗口中执行如下Transact-SQL语句。,USE 学生成绩GOCREATE TABLE Students(学号 Char(8)NOT NULL PRIMARY KEY,姓名 Varchar(12)NOT NULL,族别 Varchar

33、(8)NOT NULL DEFAULT 汉族)GO,3使用ALTER TABLE语句添加默认值约束语法格式如下。ALTER TABLE 表名ADD CONSTRAINT 默认值约束名 DEFAULT()FOR列名【例6.16】在学生成绩数据库的学生信息表中,为“族别”列添加默认值“汉族”。分析:在例6.14已经为学生信息表中的“族别”列添加默认值。先删除再使用ALTER TABLE语句完成任务。,在查询编辑器窗口中执行如下Transact-SQL语句。USE 学生成绩GOALTER TABLE 学生信息表ADD CONSTRAINT DF_学生信息表_族别DEFAULT 汉族 FOR 族别GO

34、,6.2.7 非空约束,非空约束(not null constraint)用来实现域完整性,指定特定列的值不允许为空,即让该列拒绝接受空值。1使用SSMS创建非空约束使用SSMS创建非空约束比较简单,设计表时,在表设计器中,选中需要设置非空约束的列,在【允许Null值】列选择不允许该字段为空值,即复选框不被选中。2使用 CREATE TABLE语句创建非空约束语法格式如下。CREATE TABLE 表名(列名 数据类型 CONSTRAINT 非空约束名 NULL|NOT NULL,.n),3ALTER TABLE语句添加非空约束语法格式如下。ALTER TABLE 表名ALTER COLUMN

35、 列名 数据类型 NULL|NOT NULL,6.3 使用IDENTITY列,6.3.1 建立IDENTITY列,1使用SSMS创建IDENTITY列【例6.17】在学生成绩数据库中,新建一名为“New_系部表”的表,其表结构如表6-2所示。,表6-2 New_系部表,具体操作步骤如下。1)在【对象资源管理器】窗口中,展开【数据库】|【学生成绩】节点。右击【表】节点,在弹出的快捷菜单中执行【新建表】命令,打开表设计器。2)按照前面介绍的方法输入各列,设置相关属性,建立主键和唯一约束。这里重点介绍如何设置“系部编号”的自动编号。3)把光标定位到系部编号列,在【列属性】区域展开【标识规范】,设置【

36、(是标识)】的属性值为“是”,【标识增量】属性值为1,【标识种子】属性值为1,如图6-13所示。4)单击工具栏上的保存按钮,在弹出的【选择名称】对话框中,输入新表名“New_系部表”,单击【确定】按钮即可。,图6-13 设置IDENTITY列,2使用CREATE TABEL语句创建IDENTITY列语法格式如下。CREATE TABLE 表名(列名 数据类型 IDENTITY(seed,increment),.n)其中,参数说明如下。数据类型:必须是整型数据类型或decimal和numeric。Seed:装载到表中的第一行所使用的值,又称标识种子,默认值为1。Increment:增量值,该值被

37、添加到前一个已装载的行的标识值上,默认值为1。,【例6.18】在学生成绩数据库中,新建一名为“New_成绩表”的表,其表结构如表6-3所示。,表6-3 New_成绩表,在查询编辑器窗口中执行如下Transact-SQL语句。USE 学生成绩GOCREATE TABLE New_成绩表(序号(ID)Int NOT NULL PRIMARY KEY IDENTITY(1,1),学号 Char(8)NOT NULL,课程编号 Char(4)NOT NULL,成绩 Decimal(4,1)CHECK(成绩=0 AND 成绩=100)GO,3使用ALTER TABEL语句添加IDENTITY列语法格式如

38、下。ALTER TABLE 表名ADD 列名 数据类型IDENTITY(seed,increment)【例6.19】在学生成绩数据库的New_成绩表中,先删除例6.18中建的标识列“序号(ID)”,再新增一个名为“成绩序号(ID)”的标识列,种子为1,增量为2。分析:在例6.18建标识列“序号(ID)”的同时定义了主键约束,要删除该列,得先删除该列上的主键,先在【对象资源管理器】中,查看一下该表主键的名称,该名称为系统自动生成。,在查询编辑器窗口中执行如下Transact-SQL语句:USE 学生成绩GOALTER TABLE New_成绩表DROP CONSTRAINT PK_New_成绩表

39、_5B9C8F9E619B8048GOALTER TABLE New_成绩表DROP COLUMN 序号(ID)GOALTER TABLE New_成绩表ADD 成绩序号(ID)Int IDENTITY(1,2)GO,6.3.2 使用IDENTITY列,【例6.20】在学生成绩数据库的New_系部表中,插入三条记录,并查询插入记录后的New_系部表。在查询编辑器窗口中执行如下Transact-SQL语句。USE 学生成绩GOINSERT INTO New_系部表(系部名称,系部主任)VALUES(信息工程系,张岚)INSERT INTO New_系部表(系部名称,系部主任)VALUES(生物工

40、程系,赵晓红)INSERT INTO New_系部表(系部名称,系部主任)VALUES(工程技术系,王江林)GOSELECT*FROM New_系部表 GO,运行结果如图6-14所示。,图6-14 在New_系部表中使用IDENTITY列,【说明】如果经常进行删除记录操作的表中存在IDENTITY列,那么在标识值之间可能会产生差距。如果这构成了问题,那么请不要使用IDENTITY属性。但是,为了确保不产生差距,或为了弥补现有的差距,在用“SET IDENTITY_INSERT表名 ON”设置显式地输入标识值之前,请先对现有的标识值进行计算。,6.4 默认值和规则,6.4.1 默认值,与默认值约

41、束类似,默认值(default)的作用也是当用户向数据表中插入数据行时,如果没有为某列输入值,则由SQL Server自动为该列赋予默认值。与默认值约束不同的是,默认值是一种数据库对象。使用默认值对象的方法:使用CREATE DEFAULT语句创建默认值对象。使用系统存储过程sp_bindefault将其绑定到列上。1创建默认值对象创建默认值对象的语法格式如下。CREATE DEFAULT default_name AS constant_expression其中,default_name为默认值对象名称;constant_expression为只包含常量值的表达式。,2默认值绑定系统存储过程

42、sp_bindefault用于将默认值绑定到列或用户定义的数据类型,它的语法格式如下。sp_bindefault default_name,object_name,futureonly_flag其中,各参数的含义如下。object_name:为被绑定默认值的列名或用户定义的数据类型。futureonly_flag:仅当将默认值绑定到用户定义数据类型时才能使用。当此参数设置为futureonly时,该数据类型的现有列无法继承新默认值。如果 futureonly_flag 为 NULL,则新默认值将绑定到用户定义数据类型的所有列。默认值为NULL。,【例6.21】在学生成绩数据库中,创建一个默认值

43、对象“DF_族别”,值为“汉族”,并将其绑定到学生信息表的“族别”列。在查询编辑器窗口中执行如下Transact-SQL语句。USE 学生成绩GO-创建默认值对象CREATE DEFAULT DF_族别 AS 汉族GO-绑定默认值对象EXEC sp_bindefault DF_族别,学生信息表.族别GO,【说明】默认值约束和默认值对象不能同时在某个列上使用,本例在学生信息表的“族别”列绑定默认值对象“DF_族别”时,必须先把例6.16中“族别”列上的默认值约束删除。默认值对象可以多次绑定到多个不同的列上,本例中默认值对象“DF_族别”仅使用了一次,不能很好地体现默认值对象较默认值约束的优势,这

44、里只是简单说明默认值的使用。,【例6.22】使用SSMS工具查看默认值对象“DF_族别”和学生信息表的“族别”列的绑定情况。具体操作步骤如下。1)启动SSMS。2)在【对象资源管理器】窗口中,展开【数据库】|【学生成绩】|【可编程性】|【默认值】节点,可以看到定义的默认值对象“DF_族别”。3)展开【表】|【学生信息表】|【列】节点,右击【族别】列,在弹出的快捷菜单中执行【属性】命令,打开【列属性】对话框如图6-15所示,在【默认值绑定】单元格中显示绑定到“DF_族别”默认值。,图6-15 显示绑定默认值对象,3默认值删除删除默认值对象的正确方法:首先解除所有的绑定,然后再删除默认值对象。解除

45、绑定到列或用户定义的数据类型的默认值对象的语法格式如下。sp_unbindefault object_name,futureonly_flag 其中,futureonly_flag 仅在解除用户自定义数据类型的默认值绑定时使用。默认值为NULL。当 futureonly_flag 的数据类型为futureonly时,该数据类型的现有列不会失去指定默认值。删除默认值对象的语法格式如下。DROP DEFAULT default_name,.n,【例6.23】删除默认值对象“DF_族别”。执行如下Transact-SQL语句。-解除绑定EXEC sp_unbindefault 学生信息表.族别GO-

46、删除默认值对象DROP DEFAULT DF_族别GO运行结果如图6-16所示。,图6-16 删除默认值对象,6.4.2 规则,规则(rule)就是对存储在表中列或用户自定义数据类型的取值范围的规定或限制。规则是一种数据库对象。规则和约束可以同时使用,表中的列可以有一个规则及多个CHECK约束,规则与CHECK约束很相似。相比之下,使用在ALTER TABLE或CREATE TABLE命令中的CHECK约束是更标准的限制列值的方法,但CHECK约束不能直接作用于用户自定义数据类型。1创建规则语法格式如下。CREATE RULE rule_name AS condition_expression

47、其中,rule_name为规则名称。condition_expression是规则的定义,可以是用于WHERE条件子句中的任何表达式。,2规则的绑定使用系统存储过程sp_bindrule将规则绑定到列或用户定义的数据类型。它的语法格式如下。sp_bindrule rule_name,object_name,futureonly_flag其中,各参数的含义如下。object_name:要绑定规则的列名或用户自定义数据类型。futureonly_flag:仅当将规则绑定到用户自定义数据类型时才能使用。当此参数设置为 futureonly 时,可以防止具有用户自定义类型的现有列继承新的规则。如果 f

48、utureonly_flag 为 NULL,则会将新规则绑定到所有用户自定义数据类型列上。默认值为 NULL。,【例6.24】在学生成绩数据库中,创建一个规则“RL_性别”,使其取值为“男”或者“女”,并将其绑定到学生信息表的“性别”列。在查询编辑器窗口中执行如下Transact-SQL语句。USE 学生成绩GO-创建规则CREATE RULE RL_性别 AS xb=男 OR xb=女 GO-绑定规则EXEC sp_bindrule RL_性别,学生信息表.性别GO,【说明】在创建规则时,可以使用任何名称或符号表示值,但第一个字符必须是符号,本例用的是xb。在学生信息表的“性别”列上,既有C

49、HECK约束“CK_学生信息表_性别”,又绑定了规则“RL_性别”,可见规则可以和CHECK约束共同作用于某一列。【例6.25】使用SSMS工具查看规则“RL_性别”和学生信息表的“性别”列的绑定情况。具体操作步骤如下。1)在【对象资源管理器】窗口中,展开【数据库】|【学生成绩】|【可编程性】|【规则】节点,可以看到定义的规则“RL_性别”。2)展开【表】|【学生信息表】|【列】节点,右击【性别】列,在弹出的快捷菜单中执行【属性】命令,打开【列属性】对话框如图6-17所示,在【规则】单元格中显示绑定到“RL_性别”规则。,图6-17 显示绑定规则对象,3规则的删除删除规则同删除默认值对象类似。

50、需要先解除绑定才能删除规则。解除规则绑定的语法格式如下。sp_unbindrule object_name,futureonly_flag其中,futureonly_flag仅在取消用户自定义数据类型的规则绑定时使用。当 futureonly_flag的数据类型为futureonly时,该数据类型的现有列不会失去指定的规则。默认值为NULL。删除规则的语法格式如下。DROP RULE rule_name,.n,【例6.26】删除“RL_性别”规则。在查询编辑器窗口中执行如下Transact-SQL语句。USE 学生成绩GO-解除绑定EXEC sp_unbindrule 学生信息表.性别GO-删

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号