《数据库完整性幻灯片.ppt》由会员分享,可在线阅读,更多相关《数据库完整性幻灯片.ppt(27页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、数据库完整性数据库完整性第1页,共27页,编辑于2022年,星期六 第第9章章 数据库完整性数据库完整性 不同的关系数据库系统根据其应用环境的不同,往往还需要不同的关系数据库系统根据其应用环境的不同,往往还需要一些特殊的约束条件。用户定义的完整性即是针对某个特定关一些特殊的约束条件。用户定义的完整性即是针对某个特定关系数据库的约束条件,它反映某一具体应用所涉及的数据必须系数据库的约束条件,它反映某一具体应用所涉及的数据必须满足的语义要求。满足的语义要求。SQL Server提供了定义和检验这类完整性的机制,提供了定义和检验这类完整性的机制,以便用统一的系统方法来处理它们,而不是用以便用统一的系
2、统方法来处理它们,而不是用应用程序来承担这一功应用程序来承担这一功能能。SQL Server 提供了一些工具来帮助用户实现数据完整性,其提供了一些工具来帮助用户实现数据完整性,其中最主要的是规则中最主要的是规则(Rule)、缺省值、缺省值(Default)、约束、约束(Constraint)和和触发器触发器(Trigger)9.1 约束约束9.2 默认值默认值9.3 规则规则本章首页本章首页2 2 第2页,共27页,编辑于2022年,星期六 9.1 约束约束 约束约束(Constraint)是是Microsoft SQL Server 提供提供的自动保持数据库完整性的一种方法,定义了可输入表或
3、的自动保持数据库完整性的一种方法,定义了可输入表或表的单个列中的数据的限制条件。表的单个列中的数据的限制条件。主键约束主键约束PRIMARY KEY 外关键字约束外关键字约束FOREIGN KEY 惟一性约束惟一性约束UNIQUE 检查约束检查约束CHECK 缺省约束缺省约束Default 列约束和表约束列约束和表约束本节首页本节首页3 3 第3页,共27页,编辑于2022年,星期六 9.1 约束约束1.PRIMARY KEY 约束约束 用于定义基本表的主键,它是惟一确定表中每一条记录的标识符,其用于定义基本表的主键,它是惟一确定表中每一条记录的标识符,其值不能为值不能为NULL,也不能重复,
4、且,也不能重复,且IMAGE 和和TEXT 类型的列不能被指类型的列不能被指定为主键,以此来保证实体的完整性。定为主键,以此来保证实体的完整性。语法如下:语法如下:CONSTRAINT constraint_namePRIMARY KEY CLUSTERED|NONCLUSTERED(column_name)4 4 第4页,共27页,编辑于2022年,星期六 9.1 约束约束/*/*例例9.19.1:testtest数据库创建数据库创建departmentdepartment表,指定表,指定dnodno为主键为主键*/Use testUse testGoGoCreate table depar
5、tment Create table department /*部门表*/(dno int primary key,(dno int primary key,/*部门号,为主键*/dname char(20)dname char(20)/*部门名*/)GoGo本节首页本节首页Create table departmentCreate table department(dno int,(dno int,dname char(20),dname char(20),CONSTRAINT PK_salaryCONSTRAINT PK_salary primary key(dno,dname)prima
6、ry key(dno,dname)5 5 第5页,共27页,编辑于2022年,星期六 9.1 约束约束 2.FOREIGN KEY约束约束 用于建立和加强两个表数据之间的链接的一列或多列。外键约束用用于建立和加强两个表数据之间的链接的一列或多列。外键约束用于强制参照完整性。当一个表中的一列或多个列的组合和其它表中的主于强制参照完整性。当一个表中的一列或多个列的组合和其它表中的主键定义相同时,就可以将这些列或列的组合定义为外键,并设定它适合键定义相同时,就可以将这些列或列的组合定义为外键,并设定它适合哪个表中哪些列相关联。哪个表中哪些列相关联。外关键字约束的作用还体现在,当向含有外关键字的表插入
7、数据外关键字约束的作用还体现在,当向含有外关键字的表插入数据时,如果与之相关联的表的列中无与插入的外关键字列值相同的值时,时,如果与之相关联的表的列中无与插入的外关键字列值相同的值时,系统会拒绝插入数据。系统会拒绝插入数据。语法如下:语法如下:CONSTRAINT constraint_nameFOREIGN KEY(column_name,n)REFERENCES ref_table(ref_column,n)6 6 第6页,共27页,编辑于2022年,星期六 9.1 约束约束当使用外部键约束时,应该考虑以下几个因素:当使用外部键约束时,应该考虑以下几个因素:外部键约束提供了字段参照完整性;
8、外部键约束提供了字段参照完整性;外部键从句中的字段数目和每个字段指定的数据类型都必须和外部键从句中的字段数目和每个字段指定的数据类型都必须和REFERENCES从句中的字段相匹配;从句中的字段相匹配;外部键约束不能自动创建索引,需要用户手动创建;外部键约束不能自动创建索引,需要用户手动创建;用户想要修改外部键约束的数据,必须有对外部键约束所参考表用户想要修改外部键约束的数据,必须有对外部键约束所参考表的的SELECT权限或者权限或者REFERENCES权限;权限;参考同一表中的字段时,必须只使用参考同一表中的字段时,必须只使用REFERENCES子句,不能子句,不能使用外部键子句;使用外部键子
9、句;一个表中最多可以有一个表中最多可以有31个外部键约束;个外部键约束;在临时表中,不能使用外部键约束;在临时表中,不能使用外部键约束;主键和外部键的数据类型必须严格匹配主键和外部键的数据类型必须严格匹配 7 7 第7页,共27页,编辑于2022年,星期六 9.1 约束约束/*/*例例9.29.2:使用外键约束:使用外键约束*/UseUse testtestGoGoCreate table workerCreate table worker(no int primary key,(no int primary key,name char(8),name char(8),sex char(2),
10、sex char(2),dno int /*dno int /*部部门编门编号号*/foreign key references department(dno)foreign key references department(dno)on delete no action,/*on delete no action,/*删删除因除因错误错误失失败败*/*/address char(30)address char(30)GoGo本节首页本节首页8 8 第8页,共27页,编辑于2022年,星期六 9.1 约束约束3.UNIQUE约束约束 指定一个或多个列的组合的值具有惟一性,以防止在列中输指定一
11、个或多个列的组合的值具有惟一性,以防止在列中输入重复的值。语法如下:入重复的值。语法如下:CONSTRAINT constraint_nameUNIQUE CLUSTERED|NONCLUSTERED -指定索引类别指定索引类别(column_name,n)当使用惟一性约束时,需要考虑以下几个因素:当使用惟一性约束时,需要考虑以下几个因素:使用惟一性约束的字段允许为空值;使用惟一性约束的字段允许为空值;一个表中可以允许有多个惟一性约束;一个表中可以允许有多个惟一性约束;可以把惟一性约束定义在多个字段上;可以把惟一性约束定义在多个字段上;惟一性约束用于强制在指定字段上创建一个惟一性索引;惟一性约
12、束用于强制在指定字段上创建一个惟一性索引;默认情况下,创建的索引类型为非聚集索引。默认情况下,创建的索引类型为非聚集索引。9 9 第9页,共27页,编辑于2022年,星期六 9.1 约束约束u PRIMARY KEY与与UNIQUE约束类似,通过建立唯一索引来保证约束类似,通过建立唯一索引来保证基本表在主键列取值的唯一性,但它们之间存在着很大的区别:基本表在主键列取值的唯一性,但它们之间存在着很大的区别:在一个基本表中只能定义一个在一个基本表中只能定义一个PRIMARY KEY约束,但可定义约束,但可定义多个多个UNIQUE约束;约束;对于指定为对于指定为PRIMARY KEY的一个列或多个列
13、的组合,其中任的一个列或多个列的组合,其中任何一个列都不能出现空值,而对于何一个列都不能出现空值,而对于UNIQUE所约束的唯一键,则所约束的唯一键,则允许为空。允许为空。u 注意:不能为同一个列或一组列既定义注意:不能为同一个列或一组列既定义UNIQUE约束,又定约束,又定义义PRIMARY KEY约束。约束。u PRIMARY KEY既可用于列约束,也可用于表约束。既可用于列约束,也可用于表约束。1010 第10页,共27页,编辑于2022年,星期六 9.1 约束约束/*/*例例9.39.3:test test数据库创建数据库创建table5table5表,指定表,指定c1c1不含重复值不
14、含重复值*/Use testUse testGoGoCreate table table5Create table table5(c1 int unique,(c1 int unique,c2 int c2 int)GoGoInsert table5 values(1,100)Insert table5 values(1,100)GoGoInsert table5 values(1,200)Insert table5 values(1,200)GoGo本节首页本节首页1111 第11页,共27页,编辑于2022年,星期六 9.1 约束约束 4.CHECK约束约束 对输入列或整个表中的值设置检查
15、条件,以限制输入值,保对输入列或整个表中的值设置检查条件,以限制输入值,保证数据库的数据完整性。语法如下:证数据库的数据完整性。语法如下:CONSTRAINT constraint_nameCHECK NOT FOR REPLICATION(logical_expression)当使用检查约束时,应该考虑和注意以下几点:当使用检查约束时,应该考虑和注意以下几点:一个列级检查约束只能与限制的字段有关;一个表级检查约束只能与限制的表中一个列级检查约束只能与限制的字段有关;一个表级检查约束只能与限制的表中字段有关;字段有关;一个表中可以定义多个检查约束;一个表中可以定义多个检查约束;每个每个CREA
16、TE TABLE语句中每个字段只能定义一个检查约束;语句中每个字段只能定义一个检查约束;在多个字段上定义检查约束,则必须将检查约束定义为表级约束;在多个字段上定义检查约束,则必须将检查约束定义为表级约束;当执行当执行INSERT语句或者语句或者UPDATE语句时,检查约束将验证数据;语句时,检查约束将验证数据;检查约束中不能包含子查询。检查约束中不能包含子查询。1212 第12页,共27页,编辑于2022年,星期六 9.1 约束约束/*/*例例9.49.4:test test数据库创建数据库创建table6table6表,指定表,指定f2f2只能只能0-1000-100分分*/Use test
17、Use testGoGoCreate table table6Create table table6(f1 int,(f1 int,f2 int not null check(f2=0 and f2=0 and f2=100)GoGoInsert table6 values(1,120)Insert table6 values(1,120)GoGo本节首页本节首页1313 第13页,共27页,编辑于2022年,星期六 9.1 约束约束5.Default约束约束 在插入操作中如果没提供输入值时,则系统自动指定值。默认约束在插入操作中如果没提供输入值时,则系统自动指定值。默认约束可以包括常量、函数
18、、不带变元的内建函数或空值。可以包括常量、函数、不带变元的内建函数或空值。语法如下:语法如下:CONSTRAINT constraint_nameDEFAULT constant_expression FOR column_name例:例:constraint de_order_quantity default 100 for order_quantity使用默认约束时,应该注意以下几点:使用默认约束时,应该注意以下几点:每个字段只能定义一个默认约束;每个字段只能定义一个默认约束;如果定义的默认值长于其对应字段的允许长度,那么输入到表中的默认值将如果定义的默认值长于其对应字段的允许长度,那么输
19、入到表中的默认值将被截断;被截断;不能加入到带有不能加入到带有IDENTITY属性或者数据类型为属性或者数据类型为timestamp的字段上;的字段上;如果字段定义为用户定义的数据类型,而且有一个默认绑定到这个数据类型如果字段定义为用户定义的数据类型,而且有一个默认绑定到这个数据类型上,则不允许该字段有默认约束。上,则不允许该字段有默认约束。本节首页本节首页1414 第14页,共27页,编辑于2022年,星期六 9.1 约束约束6.列约束和表约束列约束和表约束 列约束作为列定义的一部分只作用于此列本身。列约束是对某一个特列约束作为列定义的一部分只作用于此列本身。列约束是对某一个特定列的约束,包
20、含在列定义中,直接跟在该列的其他定义之后,用空格定列的约束,包含在列定义中,直接跟在该列的其他定义之后,用空格分隔,不必指定列名。分隔,不必指定列名。表约束作为表定义的一部分,可以作用于多个列。表约束与列定义表约束作为表定义的一部分,可以作用于多个列。表约束与列定义相互独立,不包括在列定义中,通常用于对多个列一起进行约束,与相互独立,不包括在列定义中,通常用于对多个列一起进行约束,与列定义用列定义用,分隔,定义表约束时必须指出要约束的那些列的名称分隔,定义表约束时必须指出要约束的那些列的名称。1515 第15页,共27页,编辑于2022年,星期六 9.1 约束约束/*/*例例9.59.5:te
21、st test数据库创建数据库创建table7table7表,主键为表,主键为c1c1和和c2*/c2*/Use testGoCreate table table7(c1 int,c2 int,c3 char(5),c4 char(10),constraint c1 primary key(c1,c2)/*表约束表约束*/)GoInsert table7 values(1,2,ABC1,XYZ1)Insert table7 values(1,2,ABC2,XYZ2)GoSelect*from table7Go 本节首页本节首页1616 第16页,共27页,编辑于2022年,星期六9.2 默认值
22、默认值 默默认认值值Default 是是往往用用户户输输入入记记录录时时没没有有指指定定具具体体数数据的列中自动插入的数据。据的列中自动插入的数据。默认值对象与默认值对象与ALTER TABLE 或或CREATE TABLE 命令操作表时用命令操作表时用DEFAULT 选项指定的缺省值功能相似,选项指定的缺省值功能相似,但默认值对象可以用于多个列或用户自定义数据类型。但默认值对象可以用于多个列或用户自定义数据类型。创建默认对象创建默认对象绑定默认对象绑定默认对象重命名默认对象重命名默认对象解除默认对象的绑定解除默认对象的绑定删除默认对象删除默认对象本章首页本章首页1717 第17页,共27页,
23、编辑于2022年,星期六9.2 默认值默认值在创建表时指定默认值在创建表时指定默认值/*/*例例9.69.6:testtest数据库创建数据库创建table8table8表,表,c2c2指定默认值为当指定默认值为当前日期前日期*/Use testGoCreate table table8(c1 int,c2 datetime default(getdate()GoInsert table8(c1)values(1)Select*from table8Go1818 第18页,共27页,编辑于2022年,星期六9.2 默认值默认值1.用用CREATE DEFAULT 命令创建默认对象命令创建默认对
24、象其语法如下其语法如下:CREATE DEFAULT default_name AS constant_expressiondefault_name 缺省值名称缺省值名称constant_expression 可以是数学表达式或函数,也可以包含表的可以是数学表达式或函数,也可以包含表的列名或其它数据库对象。列名或其它数据库对象。例:创建例:创建con3默认对象默认对象Use testGoCreate default con3 as 10 /*默认值设置为默认值设置为10*/Go本节首页本节首页1919 第19页,共27页,编辑于2022年,星期六9.2 默认值默认值2.绑定默认对象绑定默认对象
25、其语法如下其语法如下:sp_bindefault defname=default,objname=object_name,futureonly例:绑定默认对象例:绑定默认对象con3到到test数据库数据库table8表的表的c1列上列上 Use testGoExec sp_bindefault con3,table8.c1Go本节首页本节首页2020 第20页,共27页,编辑于2022年,星期六9.2 默认值默认值3.解除默认对象的绑定解除默认对象的绑定其语法如下其语法如下:Sp_unbindefault objname=object_name,futureonly例:解除例:解除test数
26、据库中数据库中table8表的表的c1列上的默认对象绑定列上的默认对象绑定Use test GoExec sp_unbindefault table8.c1Go本节首页本节首页2121 第21页,共27页,编辑于2022年,星期六9.2 默认值默认值4.删除默认对象删除默认对象其语法如下其语法如下:DROP DEFAULT default_name,.n例:删除默认对象例:删除默认对象con3Use testGoIf exists(select name from sysobjectswhere name=con3 and type=D)drop default con3Go本节首页本节首页2
27、222 第22页,共27页,编辑于2022年,星期六9.3 规则规则 规则(规则(Rule)就是数据库中对存储在表的列或用户自就是数据库中对存储在表的列或用户自定义数据类型中的值的规定和限制。定义数据类型中的值的规定和限制。规则是单独存储的独立的数据库对象。规则是单独存储的独立的数据库对象。规则与其作用的表或用户自定义数据类型是相互独立的。规则与其作用的表或用户自定义数据类型是相互独立的。规则和约束可以同时使用,表的列可以有一个规则及多个规则和约束可以同时使用,表的列可以有一个规则及多个CHECK 约束。约束。创建创建规则规则 绑定绑定规则规则 解除和删除解除和删除规则规则本章首页本章首页23
28、23 第23页,共27页,编辑于2022年,星期六9.3 规则规则1.创建规则创建规则1)用企业管理器创建规则)用企业管理器创建规则2)用)用CREATE RULE 命令创建规则命令创建规则语法格式为:语法格式为:CREATE RULE rule_name AS condition_expression rule_name 规则名称。规则名称。condition_expression 规则的定义,是能用于规则的定义,是能用于WHERE 条件条件子句中的任何表达式,它可以包含算术运算符、关系运算符和谓词(如子句中的任何表达式,它可以包含算术运算符、关系运算符和谓词(如IN、LIKE、BETWEE
29、N等)。等)。2424 第24页,共27页,编辑于2022年,星期六9.3 规则规则例:限定输入值在例:限定输入值在010之间。之间。Use testGoCreate rule rule1 as c1 between 0 and 10Go例:限定输入值为例:限定输入值为2,5,8Create rule rule2 as c1 in(2,5,8)Go例:限定输入值为例:限定输入值为16之间的整数结尾之间的整数结尾Create rule rule3 as value like _%1-6Go本节首页本节首页2525 第25页,共27页,编辑于2022年,星期六9.3 规则规则2.规则的绑定规则的绑
30、定创建规则后,规则仅仅只是一个存在于数据库中的对象。创建规则后,规则仅仅只是一个存在于数据库中的对象。1)用企业管理器绑定规则)用企业管理器绑定规则2)用存储过程)用存储过程Sp_bindrule 绑定规则绑定规则sp_bindrule rulename=rule,objname=object_name,futureonly例:例:绑定规绑定规 则则rule1到到test数据库数据库table8表的表的c1列上列上Use testGoExec sp_bindrule rule1,table8.c1Go本节首页本节首页2626 第26页,共27页,编辑于2022年,星期六9.3 规则规则3.解除和删除解除和删除规则规则用存储过程用存储过程Sp_unbindrule 解除规则的绑定解除规则的绑定 sp_unbindrule objname=object_name ,futureonly例:解除例:解除table8表的表的c1列上规则列上规则Use testGoExec sp_unbindrule table8.c1Go用用DROP RULE语句语句删除删除规则规则 DROP RULE rule,Use testGoDrop rule rule1本章首页本章首页2727 第27页,共27页,编辑于2022年,星期六