《第7章 实现数据完整性-2ppt课件.ppt》由会员分享,可在线阅读,更多相关《第7章 实现数据完整性-2ppt课件.ppt(107页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、在此输入您的封面副标题第7章 实现数据完整性-2中国铁道出版社中国铁道出版社33【能力目标】【能力目标】 能描述数据完整性的含义及分类 学会使用CHECK约束、RULE规则、DEFAULT默认值约束、DEFAULT默认值对象保证列数据完整性(即域完整性) 学会使用索引、PRIMARY KEY主键约束、UNIQUE唯一约束或IDENTITY属性来保证行数据完整性(即实体完整性) 学会使用从表的FOREIGN KEY外键约束与主表的定义主键PRIMARY KEY或唯一键UNIQUE约束(不允许为空)实现主表与从表之间的参照完整性第第7章章 实现数据完整性实现数据完整性44【项目描述】【项目描述】为
2、XS数据库创建CHECK约束、RULE规则、DEFAULT默认值约束、DEFAULT默认值对象、索引、PRIMARY KEY主键约束、UNIQUE唯一约束、FOREIGN KEY外键约束实现数据完整性保护。第第7章章 实现数据完整性实现数据完整性55【项目分析】【项目分析】项目4在学生数据库XS中建立了数据表,在向表中输入数据时,由于种种原因,有时会输入无效或错误的信息。比如:对不同的学生输入了相同的学号;性别字段的值输入了非法数据;相同的数据行被多次输入;学生成绩表中出现了学生档案表中不存在的学号等。之所以会出现这些错误信息,是因为没有实现数据完整性设计。为避免此类情况发生,本项目主要介绍如
3、何通过实施数据完整性来解决上述问题。以此保证数据输入的正确性、一致性和可靠性。第第7章章 实现数据完整性实现数据完整性66【任务设置】【任务设置】任务1实现域完整性任务2实现实体完整性 任务3实现参照完整性实训八实现sale数据库完整性第第7章章 实现数据完整性实现数据完整性77【项目定位】【项目定位】数据库系统开发第第7章章 实现数据完整性实现数据完整性88【任务目标】【任务目标】 能阐述数据完整性的概念 能阐述数据完整性的准确分类 学会使用CHECK约束、RULE规则、DEFAULT默认值约束、DEFAULT默认值对象实现域完整性-任务1 实现域完整性第第7章章 实现数据完整性实现数据完整
4、性99【任务描述】【任务描述】按需求在XS数据库完成以下域完整性相关的操作。1. 使用CREATE语句创建表book(书号char(6)、书名char(20)、类型char(20)、价格int)字段。给“价格”字段定义一个名为max_price的check约束 ,使得价格不超过200。2. 定义一个名为type_rule的规则,并绑定到book表的“类型”字段,使得“类型”字段只接受该规则中列出的值(计算机类、科普类、文学类、自然科学)。3解除第2题中的规则绑定关系。4. 删除第2题中的规则。5修改book表,为“类型”字段设置一个默认值约束,约束名为BookType,默认值为“NEW BOO
5、K”。6. 从book表中删除默认值约束BookType。-任务1 实现域完整性第第7章章 实现数据完整性实现数据完整性10107. 定义默认值对象Day,取值为getdate()。8修改XSDA表,向学生表中添加字段“入学时间”。9将默认值对象Day绑定到XSDA表的“入学时间”字段。10.定义一个用户定义数据类型:Today。11.将默认值对象Day绑定到用户自定义数据类型ToDay。12.修改book表,向book表中添加字段“购买日期”,定义类型为ToDay。13.解除默认值对象Day与XSDA表“入学时间”、自定义数据类型Today的绑定关系。14.删除默认值对象Day。15.阐述数
6、据完整性的分类,以及每类完整性都由哪些约束实现。-任务1 实现域完整性第第7章章 实现数据完整性实现数据完整性1111【任务分析】【任务分析】练习域完整性的实现,包括:CHECK约束及默认值约束的创建,规则及默认值对象的定义、绑定、解除绑定、删除。特别要注意:规则和默认值对象,使用它们要首先定义,然后绑定到列或用户定义数据类型;不需要时要先解除绑定,然后删除规则。-任务1 实现域完整性第第7章章 实现数据完整性实现数据完整性1212数据完整性就是用于保证数据库中的数据在逻辑上的一致性、正确性和可靠性。强制数据完整性可确保数据库中的数据质量。数据完整性一般包括3种类型:域完整性、实体完整性、参照
7、完整性。-任务1 实现域完整性第第7章章 实现数据完整性实现数据完整性13131 1域完整性域完整性域完整性又称为列完整性,指给定列输入的有效性,即保证指定列的数据具有正确的数据类型、格式和有效的数据范围。实现域完整性可通过定义相应的CHECK约束、默认值约束、默认值对象、规则对象等方法来实现,另外,通过为表的列定义数据类型和NOT NULL也可以实现域完整性。例如,KCXX表中每门课程的学分应在010之间,为了对学分这一数据项输入的数据范围进行限制,可以在定义KCXX表结构的同时通过定义学分的CHECK约束来实现。-任务1 实现域完整性第第7章章 实现数据完整性实现数据完整性14142 2实
8、体完整性实体完整性实体完整性又称为行的完整性,是用于保证数据表中每一个特定实体的记录都是唯一的。通过索引、UNIQUE约束、PRIMARY KEY约束或IDENTITY属性可以实现数据的实体完整性。例如,对于XSDA表,学号作为主键,每一个学生的学号都能唯一地标识该学生对应的行记录信息,那么在输入数据时,就不能有相同学号的行记录,通过对学号字段建立PRIMARY KEY约束可以实现XSDA表的实体完整性。-任务1 实现域完整性第第7章章 实现数据完整性实现数据完整性15153 3参照完整性参照完整性 当增加、修改或删除数据表中的记录时,可以借助参照完整性来保证相关联表之间数据的一致性。参照完整
9、性可以保证主表中的数据与从表中数据的一致性。在SQL SERVER 2008中,参照完整性是通过定义外键与主键之间或外键与唯一键之间的对应关系来实现的。参照完整性确保同一键值在所有表中一致。例如,对于XS数据库中的XSDA表中的每个学生的学号,在XSCJ表中都有相关的课程成绩记录,将XSDA表作为主表,学号字段定义为主键,XSCJ表作为从表,表中的学号字段定义为外键,从而建立主表和从表之间的联系实现参照完整性。-任务1 实现域完整性第第7章章 实现数据完整性实现数据完整性1616XSDA表和XSCJ表的对应关系如表7-1、表7-2所示。-任务1 实现域完整性第第7章章 实现数据完整性实现数据完
10、整性1717如果定义了两个表之间的参照完整性,则要求:如果定义了两个表之间的参照完整性,则要求:(1)从表不能引用不存在的键值。例如:对于XSCJ表的行记录中出现的学号必须是XSDA表中已经存在的学号。(2)如果主表中的键值更改了,那么在整个数据库中,对从表中该键值的所有引用要进行一致的更改。例如:如果XSDA表中的某一学号修改了,XSCJ表中所有对应学号也要进行相应的修改。(3)如果主表中没有关联的记录,则不能将记录添加到从表中。(4)如果要删除主表中的某一记录,应先删除从表中与该记录匹配的相关记录。-任务1 实现域完整性第第7章章 实现数据完整性实现数据完整性1818CHECK约束实际上是
11、字段输入内容的验证规则,表示一个字段的输入内容必须满足CHECK约束的条件,若不满足,则数据无法正常输入。CHECK约束可以作为表定义的一部分在创建表时创建,也可以添加到现有表中。表和列可以包含多个CHECK约束。允许修改或删除现有的CHECK约束。-任务1 实现域完整性第第7章章 实现数据完整性实现数据完整性19191 1使用使用SQL Server Management StudioSQL Server Management Studio定义定义CHECKCHECK约束约束在XS数据库的XSCJ表中,学生每门课程的成绩一般在0100的范围内,如果对用户的输入数据要施加这一限制,可以按照如下
12、步骤进行操作。(1)启动SQL Server Management Studio,打开XSCJ表的表设计器窗口,单击鼠标右键,出现如图7-1所示的快捷菜单。(2)选择【CHECK 约束】选项,进入如图7-2所示的“CHECK约束”属性窗口。-任务1 实现域完整性第第7章章 实现数据完整性实现数据完整性2020-任务1 实现域完整性图7-1 表设计器快捷菜单图7-2 “CHECK约束”属性窗口第第7章章 实现数据完整性实现数据完整性2121(3)单击【添加】按钮,进入如图7-3 所示的的“CHECK约束”设置窗口,在【选定的CHECK约束】框中显示由系统分配的新约束名。名称以“CK_”开始,后跟
13、表名,可以修改此约束名。在【表达式】框中,可以直接输入约束表达式“成绩=0 and 成绩任务1 实现域完整性第第7章章 实现数据完整性实现数据完整性2222-任务1 实现域完整性图7-3 “CHECK约束”设置窗口图7-4 “CHECK约束表达式编辑”窗口第第7章章 实现数据完整性实现数据完整性2323(4)如果允许创建的约束用于强制INSERT和UPDATE以及检查原有数据等情况,可以在图7-3所示窗口右下方的相应选项中选择“是”。最后,单击【关闭】按钮,则完成了CHECK约束的设置。按上述步骤创建约束后,输入数据时如果成绩不在0100的范围内,系统将报告错误。如果要删除上述约束,只需进入如
14、图7-3所示的CHECK约束设置窗口,在【选定的CHECK约束】框中选择要删除的约束,然后单击【删除】按钮即可。注意:对于TimeStamp 和Identity两种类型的字段不能定义CHECK约束。-任务1 实现域完整性第第7章章 实现数据完整性实现数据完整性24242 2使用使用T-SQLT-SQL语句在创建表时定义语句在创建表时定义CHECKCHECK约束约束使用SQL语句创建表结构时,可以定义CHECK约束。语法格式:CREATE TABLE table_name /*指定表名(column_name datatype NOT NULL | NULL /*定义列名、数据类型、是否空值CO
15、NSTRAINT check_name CHECK (logical_expression),n) /*定义CHECK约束说明:关键字CHECK表示定义CHECK约束,其后的logical_expression是逻辑表达式,称为CHECK约束表达式。【例7-1】在XS数据库中创建学生信息表XSXX并定义CHECK约束。-任务1 实现域完整性第第7章章 实现数据完整性实现数据完整性25253 3使用使用T-SQLT-SQL语句在修改表时定义语句在修改表时定义CHECKCHECK约束约束对于已经存在的表,也可以定义CHECK约束。在现有表中添加CHECK约束时,该约束可以仅作用于新数据,也可以同时
16、作用于已有的数据。语法格式:ALTER TABLE table_name WITH CHECK | WITH NOCHECKADD CONSTRAINT check_name CHECK (logical_expression)-任务1 实现域完整性第第7章章 实现数据完整性实现数据完整性2626说明:说明:关键字ADD CONSTRAINT表示在已经定义的table_name表中增加一个约束定义,约束名由check_name指定,约束表达式为logical_expression。WITH CHECK选项表示CHECK约束同时作用于已有数据和新数据;当省略该选项,取默认设置时,也表示CHECK
17、约束同时作用于已有数据和新数据;WITH NOCHECK选项表示CHECK约束仅作用于新数据,对已有数据不强制约束检查。【例7-2】通过修改XS数据库中的XSCJ表,增加成绩字段的CHECK约束。-任务1 实现域完整性第第7章章 实现数据完整性实现数据完整性27274 4使用使用T-SQLT-SQL语句删除语句删除CHECKCHECK约束约束语法格式:ALTER TABLE table_nameDROP CONSTRAINT check_name说明:在table_name指定的表中,删除名为check_name的约束。【例7-3】删除XSCJ表中的成绩字段的CHECK约束。-任务1 实现域完
18、整性第第7章章 实现数据完整性实现数据完整性2828规则是保证域完整性的主要手段,它类似于CHECK约束。与CHECK约束相比,其执行功能相同。CHECK约束是使用ALTER TABLE 或CREATE TABLE的CHECK关键字创建的,是对列中的值进行限制的首选标准方法(可以对一列或多列定义多个约束)。规则是一种数据库对象,可以绑定到一列或多个列上,还可以绑定到用户定义数据类型上,规则定义之后可以反复使用。列或用户定义数据类型只能有一个绑定的规则。但是,列可以同时具有规则和多个CHECK约束。规则作为独立的数据库对象,使用时要首先定义,规则定义后只有将其绑定到列或用户定义数据类型后才能生效
19、;不需要时可以先解除绑定,然后删除规则。-任务1 实现域完整性第第7章章 实现数据完整性实现数据完整性29291 1定义规则定义规则规则只能利用T-SQL语句定义。语法格式:CREATE RULE rule AS condition_expression说明:参数rule是定义的新规则名,规则名必须符合标识符命名规则;参数condition_expression是规则的条件表达式,该表达式可为WHERE子句中任何有效的表达式,但规则表达式中不能包含列或其他数据库对象,可以包含不引用数据库对象的内置函数,在condition_expression条件表达式中包含一个局部变量,使用UPDATE或I
20、NSERT语句修改或插入值时,该表达式用于对规则关联的列值进行约束。定义规则时,一般使用局部变量表示UPDATE或INSERT语句输入的值。-任务1 实现域完整性第第7章章 实现数据完整性实现数据完整性3030另外有如下几点需要说明:另外有如下几点需要说明:定义的规则对先前已存在于数据库中的数据无效。在单个批处理中,CREATE RULE语句不能与其他T-SQL语句组合使用。规则表达式的类型必须与列的数据类型兼容,不能将规则绑定到text,image, timestamp列。要用单引号将字符和日期常量括起来,在十六进制常量前加0 x。对于用户定义数据类型,当在该类型的数据列中插入值,或更新该类
21、型的数据列时,绑定到该类型的规则才会激活。规则不检验变量,所以在向用户定义数据类型的变量赋值时,不能与列绑定的规则冲突。如果列同时有默认值和规则与之关联,则默认值必须满足规则的定义,与规则冲突的默认值不能插入列。-任务1 实现域完整性第第7章章 实现数据完整性实现数据完整性31312 2绑定规则绑定规则规则定义之后,需要将其绑定到列或用户定义数据类型后才能起作用。当向绑定了规则的列或使用绑定规则的用户定义数据类型的所有列插入或更新数据时,新的数据必须符合规则。绑定规则一般是通过T-SQL语句实现,在SQL Server Management Studio下规则只能绑定到用户定义数据类型,方法类
22、似于默认值的绑定,在此不再赘述。语法格式:sp_bindrule rulename=rule,objname=object_name,futureonly=futureonly_flag-任务1 实现域完整性第第7章章 实现数据完整性实现数据完整性3232说明:说明:参数rule为CREATE RULE语句创建的规则名,要用单引号括起来;参数object_name是绑定到规则的列或用户定义数据类型,如果object_name采用“表名.字段名”的格式,则认为绑定到表的列,否则绑定到用户定义数据类型;参数futureonly_flag仅当将规则绑定到用户定义数据类型时才使用。futureonly
23、_flag的默认值为 NULL,如果futureonly_flag为NULL,那么新规则将绑定到用户定义数据类型的每一列,条件是此数据类型当前无规则或者使用用户定义数据类型的现有规则;如果futureonly_flag设置为 futureonly,那么这个规则只可用于用户定义数据类型的新列,现有列将不继承新规则。-任务1 实现域完整性第第7章章 实现数据完整性实现数据完整性3333【例7-4】定义一个规则,用以限制数据输入模式。比如:对于KCXX表的课程编号列,如果规定课程编号的第1位代表开课学期(输入时只能选16),后2位代表课程序号(输入时只能选09)。按此要求定义一个规则,并绑定到KCX
24、X表的课程编号列,用于限制课程编号的输入。【例7-5】定义一个规则,用以限制数据输入的范围。比如:对于XSCJ表的成绩列,规定成绩只能输入0100之间的数。按此要求定义一个规则,并绑定到XSCJ表的成绩列,用于限制成绩的输入。-任务1 实现域完整性第第7章章 实现数据完整性实现数据完整性3434【例7-6】定义一个规则,用以限制输入到该规则所绑定的列中的值只能是该规则中列出的值。比如:对于XSDA表的系名列,规定系名只能输入“信息”、“管理”、“机械”、“电气”中的值。按此要求定义一个规则,并绑定到XSDA表的系名列,用于限制系名的输入。【例7-7】如下程序定义一个用户定义数据类型,然后将前面
25、定义的规则“kcbh_rule”绑定到用户定义数据类型course_num上,最后创建表KCXX1,其课程编号的数据类型为course_num。-任务1 实现域完整性第第7章章 实现数据完整性实现数据完整性35353 3解除绑定解除绑定 如果要删除规则,首先应先解除规则与列或用户定义数据类型之间的绑定关系,然后才能删除规则。(1)使用SQL Server Management Studio解除绑定使用SQL Server Management Studi解除绑定的方法,类似于绑定操作。只适用于用户定义数据类型,方法如下。 打开SQL Server Management Studio,展开“XS
26、数据库”,展开【可编程性】|【类型】|【用户定义数据类型】。 选中要解除绑定的类型,单击右键选择【属性】,进入“用户定义数据类型”界面,删除规则,单击【确定】按钮完成。-任务1 实现域完整性第第7章章 实现数据完整性实现数据完整性3636(2)使用T-SQL语句解除绑定解除绑定主要使用T-SQL语句实现。 语法格式:sp_unbindrule objname=object_name,futureonly=futureonly_flag说明:参数object_name用于指定解除规则绑定的列或者用户定义数据类型名。如果object_name是“表名.字段名”格式,则object_name为表中的
27、列,否则object_name为用户定义数据类型。为用户定义数据类型解除规则绑定时,所有属于该数据类型并具有相同规则的列也同时解除规则绑定。对属于该数据类型的列,如果其规则直接绑定到列上,则该列不受影响。参数futureonly_flag仅用于解除用户定义数据类型规则的绑定,当参数futureonly_flag取值为futureonly时,规则仍然对现有的属于该数据类型的列有效。-任务1 实现域完整性第第7章章 实现数据完整性实现数据完整性37374 4删除规则删除规则在解除列或用户定义数据类型与规则之间的绑定关系后,就可以删除规则了。语法格式:DROP RULE rule,n说明:参数rul
28、e指定删除的规则名,可以包含规则所有者名;参数n表示可以指定多个规则同时删除。【例7-8】解除课程编号列与规则kcbh_rule之间的绑定关系。【例7-9】解除用户定义数据类型course_num与规则kcbh_rule之间的绑定关系,并删除规则kcbh_rule。-任务1 实现域完整性第第7章章 实现数据完整性实现数据完整性3838执行DROP RULE命令时,如果规则没有绑定到列或用户定义数据类型,将显示命令成功完成信息;如果有绑定,则显示无法删除信息。解决方法是先解除绑定,再删除。可以通过对象资源管理器找到规则名,单击右键选择“查看依赖关系”,即可看到有哪些列或用户定义数据类型绑定了规则
29、。-任务1 实现域完整性第第7章章 实现数据完整性实现数据完整性3939对于某些字段,可以为其定义默认值,以方便用户的使用。一个字段的默认值的建立可通过如下两种方式实现: (1)在创建表或修改表时,定义默认值约束。(2)先定义默认值对象,然后将该对象绑定到表的相应字段或用户定义数据类型上。-任务1 实现域完整性第第7章章 实现数据完整性实现数据完整性4040【例7-4】定义一个规则,用以限制数据输入模式。比如:对于KCXX表的课程编号列,如果规定课程编号的第1位代表开课学期(输入时只能选16),后2位代表课程序号(输入时只能选09)。按此要求定义一个规则,并绑定到KCXX表的课程编号列,用于限
30、制课程编号的输入。【例7-5】定义一个规则,用以限制数据输入的范围。比如:对于XSCJ表的成绩列,规定成绩只能输入0100之间的数。按此要求定义一个规则,并绑定到XSCJ表的成绩列,用于限制成绩的输入。-任务1 实现域完整性第第7章章 实现数据完整性实现数据完整性41411 1默认值约束的定义及删除默认值约束的定义及删除默认值约束是在用户未提供某些列的数据时,数据库系统为用户提供的默认值,从而简化应用程序代码和提高系统性能。表的每一列都可包含一个默认值定义。可以修改或删除现有的默认值定义。默认值必须与默认定义适用的列的数据类型相一致,每一列只能定义一个默认值。(1)定义默认值约束在创建表或修改
31、表时,可以定义一个字段的默认值约束。默认值约束的定义可以通过SQL Server Management Studio实现(前面的章节已经介绍过,这里不再重述),也可以通过T-SQL语句来实现,下面介绍如何使用T-SQL语句定义一个字段的默认值约束。-任务1 实现域完整性第第7章章 实现数据完整性实现数据完整性4242在创建表时定义默认值约束语法格式:CREATE TABLE table_name /*指定表名(column_name datatype NOT NULL | NULL /*定义列名、数据类型、是否空值CONSTRAINT default_nameDEFAULT constrain
32、t_expression ,n) /*定义默认值约束说明:table_name为创建的表名,column_name为列名,datatype为对应列的数据类型;DEFAULT关键字表示其后的constraint_expression表达式为默认值约束表达式,此表达式只能是常量、系统函数或NULL。对于timestamp或带IDENTITY属性的字段不能定义默认值约束。参数n表示可定义多个数据字段。【例7-10】在创建表时定义一个字段的默认值约束。-任务1 实现域完整性第第7章章 实现数据完整性实现数据完整性4343在修改表时定义默认值约束在修改表时定义默认值约束有两种情况:一是对表中已存在的列添
33、加默认值约束;二是对表增加新列时,定义新列的默认值约束。语法格式1:ALTER TABLE table_name /*指定表名ADD CONSTRAINT default_nameDEFAULT constraint_expression FOR column_name ,n /*对已存在的列添加默认值约束-任务1 实现域完整性第第7章章 实现数据完整性实现数据完整性4444说明:说明:此格式是对表中已存在的列添加默认值约束。 语法格式2:ALTER TABLE table_name /*指定表名ADD column_name datatype NOT NULL | NULL /*为增加的新列
34、定义列名、数据类型、是否空值CONSTRAINT default_nameDEFAULT constraint_expression ,n /*定义默认值约束说明:此格式是对表增加新列时定义默认值约束。【例7-11】在修改表时为XSDA表中已存在的列“民族”定义默认值约束“汉”。【例7-12】在修改表时通过增加一个新字段,定义默认值约束。-任务1 实现域完整性第第7章章 实现数据完整性实现数据完整性4545(2)删除默认值约束默认值约束可以在SQL Server Management Studio中删除。如果已知一个默认值约束的约束名,也可以通过T-SQL语句进行删除,其使用方法如下例所示。【
35、例7-13】删除上例定义的默认值约束。-任务1 实现域完整性第第7章章 实现数据完整性实现数据完整性46462 2默认值对象的定义、使用及删除默认值对象的定义、使用及删除默认值对象是一种数据库对象,可以被绑定到一个或多个列上,还可以绑定到用户定义数据类型上。当某个默认值对象定义后,可以反复使用。当向表中插入数据时,如果绑定有默认值的列或者用户定义数据类型没有明确提供值,那么就将以默认值指定的数据插入。定义的默认值必须与所绑定列的数据类型一致。-任务1 实现域完整性第第7章章 实现数据完整性实现数据完整性4747默认值对象的执行与前面所讲的默认值约束功能相同,默认值约束的定义和表存储在一起,当删
36、除表时,将自动删除默认值约束。默认值约束是限制列数据的首选标准方法。然而,当在多个列中,特别是不同表中的列中多次使用默认值时,适合采用默认值对象技术。要使用默认值对象,首先要定义默认值对象,然后将其绑定到指定列或用户定义数据类型上。当取消默认值时,要先解除绑定,再删除默认值。-任务1 实现域完整性第第7章章 实现数据完整性实现数据完整性4848(1)定义默认值对象默认值对象的定义只能通过T-SQL语句实现。语法格式:CREATE DEFAULT defaultAS constant_expression-任务1 实现域完整性第第7章章 实现数据完整性实现数据完整性4949说明:说明:CREAT
37、E DEFAULT关键字表示创建一个名为default的默认值对象,默认值对象名必须符合标识符规则,可以包含默认值对象所有者名。约束表达式constant_expression只能是常量表达式(不能包含字段名或其他数据库对象的名称),可以含有常量、内置函数,字符和日期常量用单引号括起来;货币、整数和浮点常量不需要使用引号。十六进制数据必须以0 x开头,货币数据必须以美元符号($)开头。默认值对象必须与列数据类型兼容。【例7-14】定义默认值对象,设置其默认值为“汉”。-任务1 实现域完整性第第7章章 实现数据完整性实现数据完整性5050(2)绑定默认值对象 默认值对象定义之后,需要将其绑定到列
38、或用户定义数据类型上才能生效。 使用SQL Server Management Studio绑定默认值对象将【例7-14】定义的默认值对象“mz_default”,绑定到XSDA表的民族字段上,方法如下。使用T-SQL语句绑定默认值对象创建默认值对象后,要使其起作用,应使用sp_bindefault存储过程将其绑定到列或用户定义数据类型上。语法格式:sp_bindefaultdefname=default,objname=object_name,futureonly=futureonly_flag-任务1 实现域完整性第第7章章 实现数据完整性实现数据完整性5151说明:说明:参数defaul
39、t指定由CREATE DEFAULT语句创建的默认值对象名,要用单引号括起来;参数object_name指定准备绑定默认值对象的表的列名(格式为:表名.字段名)或用户定义的数据类型名,object_name要用单引号括起来。不能将默认值对象绑定到timestamp数据类型的列、带IDENTITY属性的列或者已经有DEFAULT约束的列;参数futureonly_flag仅在将默认值对象绑定到用户定义数据类型时才使用,默认值为 NULL。当futureonly_flag的值为futureonly时,表示在此之前,该数据类型关联的列不继承该默认值对象的值;如果 futureonly_flag为 N
40、ULL,那么新默认值将绑定到用户定义数据类型的任一列,条件是此数据类型当前无默认值或者使用用户定义数据类型的现有默认值。-任务1 实现域完整性第第7章章 实现数据完整性实现数据完整性5252【例7-15】对于XSDA表中的民族字段通过定义默认值对象,实现默认值设置为“汉”。【例7-16】在XS数据库中创建名为rxdate的默认值对象(取值为当前系统日期),然后将其绑定到XSXX表(例7-1中创建)的入学日期列。【例7-17】在XS数据库中定义一个名为sex的用户定义数据类型,然后定义默认值对象xb_default,并将其绑定到用户定义数据类型sex中。-任务1 实现域完整性第第7章章 实现数据
41、完整性实现数据完整性5353(3 3)解除绑定)解除绑定如果要删除一个默认值对象,首先应解除默认值对象与用户定义数据类型及表字段的绑定关系,然后才能删除该默认值对象。绑定关系的解除可以在SQL Server Management Studio中实现,也可以通过SQL语句实现。使用SQL Server Management Studio解除绑定关系在SQL Server Management Studio中解除绑定的方法,类似于绑定的操作,如果是解除绑定列,方法如下。-任务1 实现域完整性第第7章章 实现数据完整性实现数据完整性5454启动SQL Server Management Studio
42、,打开数据库中绑定默认值对象的表的表设计器,如图7-5所示。选中要解除绑定的列,在列属性下的“默认值或绑定列”对应设置下,删除所选默认值对象。单击【关闭】按钮,保存设置。如果是解除绑定到用户定义数据类型的默认值对象,方法如下。展开数据库,选择【可编程性】|【类型】|【用户定义数据类型】,选中要解除绑定的用户定义数据类型,如图7-6所示。单击右键,选择【属性】进入【用户定义数据类型】窗口,如图7-7所示。删除默认值对象,单击“确定”按钮。-任务1 实现域完整性第第7章章 实现数据完整性实现数据完整性5555 使用T-SQL语句解除绑定关系语法格式:sp_unbindefault objname=
43、object_name,futureonly=futureonly_flag说明:参数object_name为要解除默认值对象绑定关系的字段名(格式为:表名.字段名)或用户定义数据类型名。用户定义数据类型与默认值对象的绑定关系解除后,所有属于该类型的列也同时解除默认值绑定;参数futureonly_flag仅用于解除用户定义数据类型默认值的绑定。当参数futureonly_flag为futureonly时,现有的属于该数据类型的列默认值不变。-任务1 实现域完整性第第7章章 实现数据完整性实现数据完整性5656(4)删除默认值对象解除默认值对象与用户定义数据类型及表字段的绑定关系后,即可删除默
44、认值对象。使用SQL Server Management Studio删除默认值对象启动SQL Server Management Studio,展开数据库,展开【可编程性】|【默认值】,选中要删除的默认值对象名。单击右键,选择【删除】,进入【删除对象】窗口,单击【确定】按钮即可。 使用T-SQL语句删除默认值对象语法格式:DROP DEFAULT default,n说明:参数default为现有默认值对象名;参数n表示可以指定多个默认值对象同时删除。DROP DEFAULT语句不适用于DEFAULT约束。【例7-18】解除默认值对象xb_default与用户定义数据类型sex的绑定关系,然后
45、删除名为xb_default的默认值对象。-任务1 实现域完整性第第7章章 实现数据完整性实现数据完整性57571. 1. 使用使用CREATECREATE语句创建表语句创建表bookbook(书号(书号char(6)char(6)、书名、书名char(20)char(20)、类型、类型char(20)char(20)、价格、价格intint)字段。给字段。给“价格价格”字段定义一个名为字段定义一个名为max_pricemax_price的的checkcheck约束约束 ,使得价格不超过,使得价格不超过200200。USE XSCREATE table book (书号 char(6),类型
46、char(20),价格 int CONSTRAINT max_price CHECK( 价格 任务1 实现域完整性第第7章章 实现数据完整性实现数据完整性58582. 2. 定义一个名为定义一个名为type_ruletype_rule的规则,并绑定到的规则,并绑定到bookbook表的表的“类型类型”字段,使得字段,使得“类型类型”字段只接受该规则中列出的值(计算机类、科普类、文学类、自然科学)。字段只接受该规则中列出的值(计算机类、科普类、文学类、自然科学)。USE XSGO -此处加GO是因为CREATE RULE必须是批查询中的第一条语句CREATE RULE type_rule AS
47、类型 IN (计算机,科普类,文学类,自然科学)GOUSE XSEXEC sp_bindrule type_rule,book.类型GO-任务1 实现域完整性第第7章章 实现数据完整性实现数据完整性59593 3解除第解除第2 2题中的规则绑定关系。题中的规则绑定关系。USE XSEXEC sp_unbindrule book.类型GO4. 4. 删除第删除第2 2题中的规则。题中的规则。USE XSDROP RULE type_ruleGO5 5修改修改bookbook表表, ,为为“类型类型”字段设置一个默认值约束,约束名为字段设置一个默认值约束,约束名为BookTypeBookType,
48、默认值为,默认值为“NEW “NEW BOOK”BOOK”。USE XSALTER TABLE book ADD CONSTRAINT BookType DEFAULT NEW BOOK FOR 类型GO-任务1 实现域完整性第第7章章 实现数据完整性实现数据完整性60606. 6. 从从bookbook表中删除默认值约束表中删除默认值约束BookTypeBookType。USE XSALTER TABLE book DROP CONSTRAINT BookType GO7. 7. 定义默认值对象定义默认值对象DayDay,取值为,取值为getdate()getdate()。USE XSGOC
49、REATE DEFAULT Day AS getdate() -该语句必须是批查询中的第一条语句GO-任务1 实现域完整性第第7章章 实现数据完整性实现数据完整性61618 8修改修改XSDAXSDA表,向学生表中添加字段表,向学生表中添加字段“入学时间入学时间”。USE XSGOALTER TABLE XSDAADD 入学时间 datetime null GO9 9将默认值对象将默认值对象DayDay绑定到绑定到XSDAXSDA表的表的“入学时间入学时间”字段。字段。USE XSGOEXEC sp_bindefault Day,XSDA.入学时间GO-任务1 实现域完整性第第7章章 实现数据
50、完整性实现数据完整性626210.10.定义一个用户定义数据类型:定义一个用户定义数据类型:TodayToday。USE XSGOEXEC sp_addtype Today,datetime,NULLGO11.11.将默认值对象将默认值对象DayDay绑定到用户自定义数据类型绑定到用户自定义数据类型ToDayToDay。USE XSGOEXEC sp_bindefault Day,TodayGO-任务1 实现域完整性第第7章章 实现数据完整性实现数据完整性636312.12.修改修改bookbook表,向表,向bookbook表中添加字段表中添加字段“购买日期购买日期”,”,定义类型为定义类型