数据完整性控制幻灯片.ppt

上传人:石*** 文档编号:87448978 上传时间:2023-04-16 格式:PPT 页数:87 大小:3.58MB
返回 下载 相关 举报
数据完整性控制幻灯片.ppt_第1页
第1页 / 共87页
数据完整性控制幻灯片.ppt_第2页
第2页 / 共87页
点击查看更多>>
资源描述

《数据完整性控制幻灯片.ppt》由会员分享,可在线阅读,更多相关《数据完整性控制幻灯片.ppt(87页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、数据完整性控制第1页,共87页,编辑于2022年,星期六本章学习目标通过本章的学习,达到以下目标:理解数据完整性的概念、类型及实现方式。掌握使用约束来实现数据完整性。掌握使用IDENTITY列实现数据完整性。掌握使用默认值对象和规则实现数据完整性。第2页,共87页,编辑于2022年,星期六本章目录数据完整性概述数据完整性概述6.1使用约束实现数据完整性使用约束实现数据完整性6.2使用使用IDENTITY列列6.3默认值和规则默认值和规则6.4实训实训66.5第3页,共87页,编辑于2022年,星期六6.1数据完整性概述第4页,共87页,编辑于2022年,星期六6.1.1数据完整性定义数据完整性

2、是指数据的精确性和可靠性,主要用于保证数据库中数据的质量。它是为防止数据库中存在不符合语义规定的数据和防止因错误信息的输入/输出造成无效操作或报错而提出的。第5页,共87页,编辑于2022年,星期六6.1.2数据完整性类型实体完整性实体完整性,又称行完整性,用于保证表中的每一行数据在表中是唯一的。保证实体完整性的措施:PRIMARYKEY约束、UNIQUE约束或IDENTITY列。域完整性域完整性,又称列完整性,是指数据表特定列输入的有效性。用来保证列值的有效性与正确性。保证域完整性的措施:限制数据的类型或格式、CHECK约束、DEFAULT约束、NOTNULL约束或规则。参照完整性参照完整性

3、,又称引用完整性,是建立在外键与主键或外键与唯一键之间的一种引用规则。保证参照完整性的措施有FOREIGNKEY约束。用户定义完整性用户定义的不属于其他任何完整性类别的特定业务规则,称为用户定义完整性。所有完整性类别都支持用户定义完整性。第6页,共87页,编辑于2022年,星期六6.1.3实现数据完整性的方式SQLServer2008中采用两种方式实现数据完整性。1声明数据完整性声明数据完整性是通过在数据库中定义一系列的数据约束与验证标准,并由数据库系统自身在插入、修改、删除数据时自动实施这些标准的一种数据完整性实现手段。声明数据完整性主要通过定义与使用约束、默认值与规则来实现。2过程数据完整

4、性过程数据完整性是通过在脚本语言中定义一系列的数据约束与验证标准,并在脚本执行过程中强制完成这些标准的检验。过程数据完整性主要通过定义与使用视图、触发器和存储过程来实现。本章仅介绍声明数据完整性的实现方法与技术。第7页,共87页,编辑于2022年,星期六6.2使用约束实现数据完整性第8页,共87页,编辑于2022年,星期六6.2.1约束概述1约束定义约束(constraint)是SQLServer2008提供的自动保持数据库完整性的一种方法。约束就是限制,定义约束就是定义可输入表或表的单个列中的数据的限制条件。2约束分类在SQLServer中有6种约束:主键约束(primarykeyconst

5、raint)唯一约束(uniqueconstraint)外键约束(foreignkeyconstraint)检查约束(checkconstraint)默认约束(defaultconstraint)非空约束(notnullconstraint)第9页,共87页,编辑于2022年,星期六约束与完整性之间的关系约束与完整性之间的关系完整性类型完整性类型约约 束束 类类 型型描描 述述约约 束束 对对 象象实体完整性primary key每行记录的唯一标识符,确保用户不能输入重复值,并自动创建索引,提高性能,该列不允许使用空值行unique在列集内强制执行值的唯一性,防止出现重复值,表中不允许有两行的

6、同一列包含相同的非空值,该列允许使用空值域完整性check指定某一列可接受的值列default当使用INSERT语句插入数据时,若已定义默认值的列没有提供指定值,则将默认值插入记录中NOT NULL指定某一列的值不能为空参照完整性foreign key定义一列或几列,其值与其他表的主键或unique列相匹配表与表之间第10页,共87页,编辑于2022年,星期六3约束名在创建约束时,需要创建约束的名称,约束名称必须符合标识符命名规则。建议使用约束类型和其完成任务的从句组合作为约束名。例如,学生信息表的主键使用PK_学生信息表。4创建约束的语法格式(1)使用CREATETABLE语句创建约束其语法

7、格式如下:CREATETABLE表名(,|)其中,参数说明如下。表名:是合法标识符,最多可有128个字符。:第11页,共87页,编辑于2022年,星期六(2)使用ALTERTABLE语句创建约束其语法格式如下:ALTERTABLE表名ADD在SQLServer中对基本表的约束分为:列约束:是对某一个特定列的约束,包含在列定义中,直接跟在该列的其他定义之后,用空格分隔,不必指定列名。表约束:与列定义相互独立,不包括在列定义中,通常用于对多个列一起进行约束,与列定义用“,”分隔,定义表约束时必须指出要约束的那些列的名称。第12页,共87页,编辑于2022年,星期六6.2.2主键约束主键约束(pri

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

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

10、星期六图6-3 系部表结构第15页,共87页,编辑于2022年,星期六2在创建表的同时创建主键约束1)创建单个列的主键可采用列级约束,它的语法格式如下。CREATETABLE表名(列名CONSTRAINT约束名PRIMARYKEYCLUSTERED|NONCLUSTERED,n)2)多个列组合的主键约束,采用表级约束,它的语法格式如下。CREATETABLE表名(CONSTRAINT约束名PRIMARYKEYCLUSTERED|NONCLUSTERED(列名1,列名n),n)其中,CLUSTERED为默认值,表示创建聚集索引,NONCLUSTERED表示创建非聚集索引。第16页,共87页,编辑

11、于2022年,星期六【例6.2】在学生成绩数据库中,创建如表1-11所示的课程信息表。在查询编辑器窗口中执行如下Transact-SQL语句:USE学生成绩GOCREATETABLE课程信息表(课程编号char(4)NOTNULLPRIMARYKEY,课程名称varchar(30)NOTNULL,学分decimal(3,1)NULL,学时intNULL,考核类型char(4)NULL)GO【说明】列约束包含在列定义中,直接跟在该列的其他定义之后,用空格分隔,不必指定约束名,系统自动给定约束名。第17页,共87页,编辑于2022年,星期六【例6.3】在学生成绩数据库中,创建如表1-12所示的成绩

12、表。分析:由于创建的是组合主键约束,所以只能采用表级约束。在查询编辑器窗口中执行如下Transact-SQL语句。USE学生成绩GOCREATETABLE成绩表(CONSTRAINTPK_成绩表PRIMARYKEY(学号,课程编号),学号char(8)NOTNULL,课程编号char(4)NOTNULL,成绩decimal(4,1)NULL)GO【说明】创建多个列组合的约束(如组合主键)时,只能将其定义为表级约束。定义时必须指出要约束的那些列的名称,与列定义用“,”分隔。第18页,共87页,编辑于2022年,星期六3在一张现有表上添加主键约束(1)使用SSMS添加主键约束在【对象资源管理器】窗

13、口中,右击要添加主键约束的表,在弹出的快捷菜单中执行【设计】命令,利用表设计器添加主键约束。(2)利用ALTERTABLE语句它的语法格式如下:ALTERTABLE表名ADDCONSTRAIN约束名PRIMARYKEYCLUSTERED|NONCLUSTERED(列名1,列名n)第19页,共87页,编辑于2022年,星期六【例6.4】为例5.1和例5.2中创建的“学生信息表”和“班级表”添加主键约束。分析:在例5.1和例5.2中创建的“学生信息表”和“班级表”不带主键约束,在此添加约束,修改表定义,使用ALTERTABLE语句。在查询编辑器窗口中执行如下Transact-SQL语句。USE学生

14、成绩GOALTERTABLE学生信息表ADDCONSTRAINTPK_学生信息表PRIMARYKEY(学号)GOALTERTABLE班级表ADDCONSTRAINTPK_班级表PRIMARYKEY(班级编号)GO第20页,共87页,编辑于2022年,星期六4删除主键约束(1)使用SSMS删除在【对象资源管理器】中,展开【数据库】|【学生成绩】|【表】|【要删除约束的表】|【键】节点,右击【主键约束名】,在弹出的快捷菜单中执行【删除】命令即可。(2)使用Transact-SQL语句删除约束的语法格式如下。ALTERTABLE表名DROPCONSTRAINT约束名1,约束名n第21页,共87页,编

15、辑于2022年,星期六6.2.3唯一约束唯一约束(uniqueconstraint)用于指定非主键的一个列或多个列的组合值具有唯一性,以防止在列中输入重复的值,也就是说如果一个数据表已经设置了主键约束,但该表中还包含其他的非主键列,也必须具有唯一性,为避免该列中的值出现重复输入的情况,必须使用唯一约束(一个数据表不能包含两个或两个以上的主键约束)。唯一约束与主键约束的区别如下:唯一约束指定的列可以为NULL,但主键约束所在的列则不允许为NULL。一个表中可以包含多个唯一约束,而主键约束则只能有一个。第22页,共87页,编辑于2022年,星期六1使用SSMS创建唯一约束【例6.5】为例6.1中创

16、建的“系部表”的“系部名称”列设置唯一约束。具体操作步骤如下。1)在【对象资源管理器】窗口中,展开【数据库】|【学生成绩】|【表】节点。右击【dbo.系部表】节点,在弹出的快捷菜单中执行【设计】命令,打开表设计器。2)在表设计器中,将光标定位在“系部名称”行,右击,在弹出的快捷菜单中执行【索引/键】命令,打开【索引/键】对话框。3)单击【索引/键】对话框左下方的【添加】按钮,按钮上方的索引/键列表框中增加一个名为“IX_系部表*”的项,星号表示该名称未确定,用户可对其进行修改。第23页,共87页,编辑于2022年,星期六4)在【索引/键】对话框右侧的属性面板中,修改【标识】的【名称】属性项的值

17、,将“IX_系部表”改为“UQ_系部表”。5)修改【常规】属性组中的两个属性项:从【类型】属性右侧的下拉列表中选择“唯一键”,如图6-4所示;单击【列】属性项右侧的按钮,打开如图6-5所示的【索引列】对话框,为唯一约束指定字段名与唯一索引的排序顺序。6)单击【索引/键】对话框右下方的【关闭】按钮。7)执行【文件】|【保存】命令或单击工具栏上的按钮。至此,唯一约束创建完成。第24页,共87页,编辑于2022年,星期六图6-4 【索引/键】对话框图6-5 【索引列】对话框第25页,共87页,编辑于2022年,星期六2创建表的同时创建唯一约束定义唯一约束的语法格式如下。语法格式1:CREATETAB

18、LE表名(列名CONSTRAINT约束名UNIQUECLUSTERED|NONCLUSTERED,n)语法格式2:CREATETABLE表名(CONSTRAINT约束名UNIQUECLUSTERED|NONCLUSTERED(列名1,列名n),n)其中,NONCLUSTERED为默认值。第26页,共87页,编辑于2022年,星期六【例6.6】删除系部表,重新创建如表1-10所示带有主键约束和唯一约束完整的系部表。在查询编辑器窗口中执行如下Transact-SQL语句。USE学生成绩GODROPTABLE系部表GOCREATETABLE系部表(系部编号char(2)NOTNULLPRIMARYK

19、EY,系部名称varchar(16)NOTNULLUNIQUE,系部主任varchar(8)NULL)GO第27页,共87页,编辑于2022年,星期六3修改表语句创建唯一约束语法格式如下。ALTERTABLE表名ADDCONSTRAINT约束名UNIQUECLUSTERED|NONCLUSTERED(列名1,列名n)【例6.7】为例5.2中创建的“班级表”的“班级名称”列添加唯一约束。在查询编辑器窗口中执行如下Transact-SQL语句。USE学生成绩GOALTERTABLE班级表ADDCONSTRAINTUQ_班级表UNIQUE(班级名称)GO唯一约束的删除同主键约束,这里不再介绍。第28

20、页,共87页,编辑于2022年,星期六6.2.4外键约束外键约束(foreignkeyconstraint)强制实现参照完整性,能够在同一个数据库的多个表之间建立关联,并维护表与表之间的依赖关系。外键约束定义一个列或多个列的组合为当前表的外键,该外键值引用其他表中的主键约束所映射列的列值。1使用SSMS创建外键约束【例6.8】在学生成绩数据库中,为班级表添加外键。具体操作步骤如下。1)在【对象资源管理器】窗口中,展开【数据库】|【学生成绩】|【表】|【dbo.班级表】节点。右击【键】节点,在弹出的快捷菜单中执行【新建外键】命令,打开如图6-6所示的【外键关系】对话框。2)单击【表和列规范】属性

21、项右侧的按钮,打开【表和列】对话框。选择系部表作为主键表,其主键为“系部编号”,系统默认选择班级表作为外键表,并将“系部编号”作为外键,如图6-7所示,单击【确定】按钮。第29页,共87页,编辑于2022年,星期六图6-6 【外键关系】对话框图6-7 【表和列】对话框第30页,共87页,编辑于2022年,星期六3)在【外键关系】对话框中单击【关闭】按钮。然后保存对班级表结构所做的修改,班级表的外键创建成功。刷新学生成绩数据库后,在【对象资源管理器】窗口中,展开【数据库】|【学生成绩】|【表】|【dbo.班级表】|【键】节点,可以看到所创建的外键约束,如图6-8所示。【说明】为确保班级表的外键约

22、束创建成功,先把班级表中的记录清除,因为在第5章中在班级表中插入有记录,而系部表为空,这样如不清除班级表中的记录,创建外键约束时会发生冲突。图6-8 查看班级表外键第31页,共87页,编辑于2022年,星期六2使用ALTERTABLE语句定义外键约束语法格式如下:ALTERTABLE外键表名ADDCONSTRAINT外键约束名FOREIGNKEY(列名1,列名2,列名n)REFERENCES主键表名(列名1,列名2,列名n)ONDELETECASCADE|NOACTION|SETNULL|SETDEFAULTONUPDATECASCADE|NOACTION|SETNULL|SETDEFAULT

23、第32页,共87页,编辑于2022年,星期六其中,参数说明如下。ONDELETE选项子句用来规定当从主键表中删除记录时,外键表中的记录将执行何种操作。子句各备选项参数意义如下。CASCADE:当从主键表中删除一行记录时,外键表中的相应记录行将被删除。NOACTION:当从主键表中删除一行记录时,外键表不采取任何操作,仅返回删除失败的错误信息,为默认值。SETNULL:当从主键表中删除一行记录时,外键表中相应记录各列被赋予空值。SETDEFAULT:当从主键表中删除一行记录时,外键表中相应记录各列被赋予默认值。ONUPDATE选项子句用来规定当从主键表中更新记录时,外键表中的记录将执行何种操作。

24、各参数的意义与ONDELETE子句相似。第33页,共87页,编辑于2022年,星期六【例6.9】在学生成绩数据库中,为成绩表创建外键约束。分析:在表1-12成绩表的结构中,有引用来自“学生信息表”的“学号”和“课程信息表”的“课程编号”两个外键列,可以使用ALTERTABLE语句创建外键约束。在查询编辑器窗口中执行如下Transact-SQL语句。USE学生成绩GOALTERTABLE成绩表ADDCONSTRAINTFK_成绩表_学生信息表FOREIGNKEY(学号)REFERENCES学生信息表(学号)GOALTERTABLE成绩表ADDCONSTRAINTFK_成绩表_课程信息表FOREI

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

26、添加到数据库关系图中,单击【关闭】按钮。产生如图6-10所示的学生成绩数据库关系图。第35页,共87页,编辑于2022年,星期六图6-9 【添加表】对话框图6-10 学生成绩数据库关系图第36页,共87页,编辑于2022年,星期六3)在图6-10中可以看到学生成绩数据库中已经建立的外键约束。在学生信息表中选中“班级编号”列,拖动鼠标指针指向班级表中的“班级编号”列,同时弹出【外键关系】和【表和列】两个对话框,分别单击【确定】和【关闭】按钮即可给学生信息表创建外键约束。4)单击工具栏上的按钮,保存数据库关系图,刷新数据库即可查看学生信息表的外键约束。外键约束的删除操作与主键约束相同,这里不再介绍

27、。第37页,共87页,编辑于2022年,星期六6.2.5检查约束检查约束(checkconstraint)通过控制列值的范围来实现域完整性。检查约束限制对特定列输入数据的范围或格式,确保该列获得有效值,避免非法数据的产生与扩散。对同一个列可定义多个检查约束。但标识列、ROWGUIDCOL列或数据类型为TIMESTAMP的列不能定义检查约束,因为这几类列的列值由数据库系统自动添加。检查约束的作用类似于外键约束,它们都能限制列的取值范围。但两种约束确定列值是否有效的方法却不相同。检查约束通过指定的逻辑表达式来限制列的取值范围。外键约束则通过其他表来限制列的取值范围。第38页,共87页,编辑于202

28、2年,星期六1使用SSMS创建检查约束【例6.11】在学生成绩数据库中,为学生信息表中的“性别”列添加检查约束,要求其取值为“男”或“女”。分析:由于学生信息表已经建立,这里用SSMS修改学生信息表结构,为“性别”列添加检查约束。具体操作步骤如下。1)在【对象资源管理器】窗口中,展开【数据库】|【学生成绩】|【表】|【dbo.学生信息表】节点。右击【约束】节点,在弹出的快捷菜单中执行【新建约束】命令,打开【CHECK约束】对话框。2)修改【标识】的【名称】属性项的值为“CK_学生信息表_性别”;在【常规】的【表达式】属性项中输入“性别=男OR性别=女”,如图6-11所示。3)单击【关闭】按钮。

29、然后保存对学生信息表结构所做的修改,“性别”列上成功创建检查约束。第39页,共87页,编辑于2022年,星期六图6-11 【CHECK约束】对话框第40页,共87页,编辑于2022年,星期六2使用CREATETABLE语句定义检查约束使用CREATETABLE语句在建表时创建检查约束,其语法格式如下。CREATETABLE表名(列名数据类型CONSTRAINT检查约束名CHECK(),n)【例6.12】在学生成绩数据库中,创建一个表名为“学生成绩表”的新表,其表的结构同表1-12成绩表。分析:表1-12成绩表已经存在,此处为了演示用CREATETABLE语句在建表时创建检查约束,所以新建一个“

30、学生成绩表”,此表在学生成绩数据库中没有意义,本例用完后删除。在查询编辑器窗口中执行如下Transact-SQL语句。第41页,共87页,编辑于2022年,星期六CREATETABLE学生成绩表(学号char(8)NOTNULL,课程编号char(4)NOTNULL,成绩decimal(4,1)NULLCHECK(成绩=0AND成绩=100),CONSTRAINTPK_学生成绩表PRIMARYKEY(学号,课程编号),CONSTRAINTFK_学生成绩表_学生信息表FOREIGNKEY(学号)REFERENCES学生信息表(学号),CONSTRAINTFK_学生成绩表_课程信息表FOREIGN

31、KEY(课程编号)REFERENCES课程信息表(课程编号)GO第42页,共87页,编辑于2022年,星期六【说明】本例在建表时,同时创建了主键约束(复合主键)、外键约束和检查约束,很具有代表性。前面没有讲用CREATETABLE语句建外键约束,不是不可以,只是更常用ALTERTABLE语句。此处所建“学生成绩表”用完后,要删除,后面不再使用。3使用ALTERTABLE语句定义检查约束其语法格式如下。ALTERTABLE表名WITHCHECK|NOCHECKADDCONSTRAINT检查约束名CHECK()其中,参数说明如下。WITHCHECK:对表中已有记录进行约束检查,此值为默认值。WIT

32、HNOCHECK:对表中已有记录不进行约束检查,只对以后插入的新记录进行检查。第43页,共87页,编辑于2022年,星期六【例6.13】在学生成绩数据库中,为课程信息表的“考核类型”列和成绩表的“成绩”列分别添加检查约束。分析:从表1-11课程信息表结构可知,“考核类型”列取值为“考试”或“考查”;从表1-12成绩表结构可知,“成绩”列取值在0100。由于课程信息表和成绩表已经存在,这里用ALTERTABLE语句来实现检查约束的创建。在查询编辑器窗口中执行如下Transact-SQL语句。第44页,共87页,编辑于2022年,星期六USE学生成绩GOALTERTABLE课程信息表ADDCONS

33、TRAINTCK_课程信息表_考核类型CHECK(考核类型=考试OR考核类型=考查)GOALTERTABLE成绩表ADDCONSTRAINTCK_成绩表_成绩CHECK(成绩=0AND成绩=100)GO第45页,共87页,编辑于2022年,星期六4删除检查约束(1)使用SSMS删除在【对象资源管理器】窗口中,展开【数据库】|【学生成绩】|【表】|【要删除约束的表】|【约束】节点,右击【检查约束名】,在弹出的快捷菜单中执行【删除】命令即可。(2)使用Transact-SQL语句删除检查约束的语法格式与删除主键约束相同。第46页,共87页,编辑于2022年,星期六6.2.6默认值约束默认值约束(D

34、efaultConstraint)用于确保域完整性,它提供了一种为数据表中的任何一列提供默认值的手段。默认值是指使用INSERT语句向数据表中插入数据时,如果没有为某一列指定数据,默认值约束提供随新记录一起存储到数据表中该列的默认值。在使用默认值约束时,用户需注意以下几点。默认值约束只能应用于INSERT语句,且定义的值必须与该列的数据类型和精度一致。在每一列上只能有一个默认值约束。默认值约束不能定义在指定IDENTITY属性或数据类型为timestamp的列上。默认值约束允许使用一些系统函数提供的值。第47页,共87页,编辑于2022年,星期六1使用SSMS创建默认值约束【例6.14】在学生

35、成绩数据库的学生信息表中,为“族别”列添加默认值“汉族”。具体操作步骤如下。1)在【对象资源管理器】窗口中,展开【数据库】|【学生成绩】|【表】节点。右击【dbo.学生信息表】节点,在弹出的快捷菜单中执行【设计】命令,打开表设计器。2)将光标定位到“族别”字段。在【列属性】区域的【默认值或绑定】栏中输入“汉族”,如图6-12所示。3)单击工具栏上的保存按钮,保存设置。第48页,共87页,编辑于2022年,星期六图6-12 创建默认值约束第49页,共87页,编辑于2022年,星期六2使用CREATETABLE语句创建默认值约束语法格式如下。CREATETABLE表名(列名数据类型CONSTRAI

36、NT默认值约束名DEFAULT,.n)【例6.15】在学生成绩数据库中,新建一个Students表,其中包含学号、姓名和族别三个字段,族别有默认值“汉族”。分析:本例为了演示在建表的同时创建默认值约束,所建的Students表在学生成绩数据库中没有用,用完要删除。在查询编辑器窗口中执行如下Transact-SQL语句。第50页,共87页,编辑于2022年,星期六USE学生成绩GOCREATETABLEStudents(学号Char(8)NOTNULLPRIMARYKEY,姓名Varchar(12)NOTNULL,族别Varchar(8)NOTNULLDEFAULT汉族)GO第51页,共87页,

37、编辑于2022年,星期六3使用ALTERTABLE语句添加默认值约束语法格式如下。ALTERTABLE表名ADDCONSTRAINT默认值约束名DEFAULT()FOR列名【例6.16】在学生成绩数据库的学生信息表中,为“族别”列添加默认值“汉族”。分析:在例6.14已经为学生信息表中的“族别”列添加默认值。先删除再使用ALTERTABLE语句完成任务。第52页,共87页,编辑于2022年,星期六在查询编辑器窗口中执行如下Transact-SQL语句。USE学生成绩GOALTERTABLE学生信息表ADDCONSTRAINTDF_学生信息表_族别DEFAULT汉族FOR族别GO第53页,共87

38、页,编辑于2022年,星期六6.2.7非空约束非空约束(notnullconstraint)用来实现域完整性,指定特定列的值不允许为空,即让该列拒绝接受空值。1使用SSMS创建非空约束使用SSMS创建非空约束比较简单,设计表时,在表设计器中,选中需要设置非空约束的列,在【允许Null值】列选择不允许该字段为空值,即复选框不被选中。2使用CREATETABLE语句创建非空约束语法格式如下。CREATETABLE表名(列名数据类型CONSTRAINT非空约束名NULL|NOTNULL,.n)第54页,共87页,编辑于2022年,星期六3ALTERTABLE语句添加非空约束语法格式如下。ALTERT

39、ABLE表名ALTERCOLUMN列名数据类型NULL|NOTNULL第55页,共87页,编辑于2022年,星期六6.3使用IDENTITY列第56页,共87页,编辑于2022年,星期六6.3.1建立IDENTITY列1使用SSMS创建IDENTITY列【例6.17】在学生成绩数据库中,新建一名为“New_系部表”的表,其表结构如表6-2所示。列列 名名数数 据据 类类 型型宽宽 度度为为 空空 性性说说 明明系部编号Int00主关键字,自动编号系部名称Varchar16取值唯一系部主任Varchar08表表6-2 New_系部表系部表第57页,共87页,编辑于2022年,星期六具体操作步骤如

40、下。1)在【对象资源管理器】窗口中,展开【数据库】|【学生成绩】节点。右击【表】节点,在弹出的快捷菜单中执行【新建表】命令,打开表设计器。2)按照前面介绍的方法输入各列,设置相关属性,建立主键和唯一约束。这里重点介绍如何设置“系部编号”的自动编号。3)把光标定位到系部编号列,在【列属性】区域展开【标识规范】,设置【(是标识)】的属性值为“是”,【标识增量】属性值为1,【标识种子】属性值为1,如图6-13所示。4)单击工具栏上的保存按钮,在弹出的【选择名称】对话框中,输入新表名“New_系部表”,单击【确定】按钮即可。第58页,共87页,编辑于2022年,星期六图6-13 设置IDENTITY列

41、第59页,共87页,编辑于2022年,星期六2使用CREATETABEL语句创建IDENTITY列语法格式如下。CREATETABLE表名(列名数据类型IDENTITY(seed,increment),.n)其中,参数说明如下。数据类型:必须是整型数据类型或decimal和numeric。Seed:装载到表中的第一行所使用的值,又称标识种子,默认值为1。Increment:增量值,该值被添加到前一个已装载的行的标识值上,默认值为1。第60页,共87页,编辑于2022年,星期六【例6.18】在学生成绩数据库中,新建一名为“New_成绩表”的表,其表结构如表6-3所示。列列 名名数数 据据 类类

42、型型宽宽 度度为为 空空 性性说说 明明序号(ID)Int0主关键字,自动编号学号Char8课程编号Char4成绩Decimal(4,1)取值在0100表表6-3 New_成绩表成绩表第61页,共87页,编辑于2022年,星期六在查询编辑器窗口中执行如下Transact-SQL语句。USE学生成绩GOCREATETABLENew_成绩表(序号(ID)IntNOTNULLPRIMARYKEYIDENTITY(1,1),学号Char(8)NOTNULL,课程编号Char(4)NOTNULL,成绩Decimal(4,1)CHECK(成绩=0AND成绩=100)GO第62页,共87页,编辑于2022年

43、,星期六3使用ALTERTABEL语句添加IDENTITY列语法格式如下。ALTERTABLE表名ADD列名数据类型IDENTITY(seed,increment)【例6.19】在学生成绩数据库的New_成绩表中,先删除例6.18中建的标识列“序号(ID)”,再新增一个名为“成绩序号(ID)”的标识列,种子为1,增量为2。分析:在例6.18建标识列“序号(ID)”的同时定义了主键约束,要删除该列,得先删除该列上的主键,先在【对象资源管理器】中,查看一下该表主键的名称,该名称为系统自动生成。第63页,共87页,编辑于2022年,星期六在查询编辑器窗口中执行如下Transact-SQL语句:USE

44、学生成绩GOALTERTABLENew_成绩表DROPCONSTRAINTPK_New_成绩表_5B9C8F9E619B8048GOALTERTABLENew_成绩表DROPCOLUMN序号(ID)GOALTERTABLENew_成绩表ADD成绩序号(ID)IntIDENTITY(1,2)GO第64页,共87页,编辑于2022年,星期六6.3.2使用IDENTITY列【例6.20】在学生成绩数据库的New_系部表中,插入三条记录,并查询插入记录后的New_系部表。在查询编辑器窗口中执行如下Transact-SQL语句。USE学生成绩GOINSERTINTONew_系部表(系部名称,系部主任)V

45、ALUES(信息工程系,张岚)INSERTINTONew_系部表(系部名称,系部主任)VALUES(生物工程系,赵晓红)INSERTINTONew_系部表(系部名称,系部主任)VALUES(工程技术系,王江林)GOSELECT*FROMNew_系部表GO第65页,共87页,编辑于2022年,星期六运行结果如图6-14所示。图6-14 在New_系部表中使用IDENTITY列第66页,共87页,编辑于2022年,星期六【说明】如果经常进行删除记录操作的表中存在IDENTITY列,那么在标识值之间可能会产生差距。如果这构成了问题,那么请不要使用IDENTITY属性。但是,为了确保不产生差距,或为了

46、弥补现有的差距,在用“SETIDENTITY_INSERT表名ON”设置显式地输入标识值之前,请先对现有的标识值进行计算。第67页,共87页,编辑于2022年,星期六6.4默认值和规则第68页,共87页,编辑于2022年,星期六6.4.1默认值与默认值约束类似,默认值(default)的作用也是当用户向数据表中插入数据行时,如果没有为某列输入值,则由SQLServer自动为该列赋予默认值。与默认值约束不同的是,默认值是一种数据库对象。使用默认值对象的方法:使用CREATEDEFAULT语句创建默认值对象。使用系统存储过程sp_bindefault将其绑定到列上。1创建默认值对象创建默认值对象的

47、语法格式如下。CREATEDEFAULTdefault_nameASconstant_expression其中,default_name为默认值对象名称;constant_expression为只包含常量值的表达式。第69页,共87页,编辑于2022年,星期六2默认值绑定系统存储过程sp_bindefault用于将默认值绑定到列或用户定义的数据类型,它的语法格式如下。sp_bindefaultdefault_name,object_name,futureonly_flag其中,各参数的含义如下。object_name:为被绑定默认值的列名或用户定义的数据类型。futureonly_flag:仅

48、当将默认值绑定到用户定义数据类型时才能使用。当此参数设置为futureonly时,该数据类型的现有列无法继承新默认值。如果futureonly_flag为NULL,则新默认值将绑定到用户定义数据类型的所有列。默认值为NULL。第70页,共87页,编辑于2022年,星期六【例6.21】在学生成绩数据库中,创建一个默认值对象“DF_族别”,值为“汉族”,并将其绑定到学生信息表的“族别”列。在查询编辑器窗口中执行如下Transact-SQL语句。USE学生成绩GO-创建默认值对象CREATEDEFAULTDF_族别AS汉族GO-绑定默认值对象EXECsp_bindefaultDF_族别,学生信息表.

49、族别GO第71页,共87页,编辑于2022年,星期六【说明】默认值约束和默认值对象不能同时在某个列上使用,本例在学生信息表的“族别”列绑定默认值对象“DF_族别”时,必须先把例6.16中“族别”列上的默认值约束删除。默认值对象可以多次绑定到多个不同的列上,本例中默认值对象“DF_族别”仅使用了一次,不能很好地体现默认值对象较默认值约束的优势,这里只是简单说明默认值的使用。第72页,共87页,编辑于2022年,星期六【例6.22】使用SSMS工具查看默认值对象“DF_族别”和学生信息表的“族别”列的绑定情况。具体操作步骤如下。1)启动SSMS。2)在【对象资源管理器】窗口中,展开【数据库】|【学

50、生成绩】|【可编程性】|【默认值】节点,可以看到定义的默认值对象“DF_族别”。3)展开【表】|【学生信息表】|【列】节点,右击【族别】列,在弹出的快捷菜单中执行【属性】命令,打开【列属性】对话框如图6-15所示,在【默认值绑定】单元格中显示绑定到“DF_族别”默认值。第73页,共87页,编辑于2022年,星期六图6-15 显示绑定默认值对象第74页,共87页,编辑于2022年,星期六3默认值删除删除默认值对象的正确方法:首先解除所有的绑定,然后再删除默认值对象。解除绑定到列或用户定义的数据类型的默认值对象的语法格式如下。sp_unbindefaultobject_name,futureonl

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁